2011-06-27 48 views
4

長時間潛伏,首次發佈,並重新學習EF4和MVC3。EF4中的數據加載策略/語法

我需要幫助,確保我在這種情況下使用正確的數據加載策略,以及一些幫助完成查詢的一些細節。我目前使用的概要加載方法概述here對於某些「儀表板」視圖需要來自大約10個表(全部具有FK關係)的少量數據。

  var query = from l in db.Leagues 
       .Include("Sport") 
       .Include("LeagueContacts") 
       .Include("LeagueContacts.User") 
       .Include("LeagueContacts.User.UserContactDatas") 
       .Include("LeagueEvents") 
       .Include("LeagueEvents.Event") 
       .Include("Seasons") 
       .Include("Seasons.Divisions") 
       .Include("Seasons.Divisions.Teams") 
       .Where(l => l.URLPart.Equals(leagueName)) 
         select (l); 

      model = (Models.League) query.First(); 

但是,我需要做一些額外的過濾,排序和整形我還沒有能夠解決的數據。以下是這點我需要的首席/顧慮:

  • 幾個子對象仍需要額外的過濾,但我一直沒能找出語法或最好的辦法呢。例如:「TOP 3 LeagueEvents.Event WHERE StartDate> = getdate()ORDER BY LeagueEvents.Event.StartDate」

  • 我需要排序一些字段。示例:ORDERBY Seasons.StartDate,LeagueEvents.Event.StartDate和LeagueContacts.User.SortOrder等。

  • 我已經非常關注此查詢生成的SQL的總體大小以及連接數和我想,我可能需要不同的數據加載方法產品總數。(顯式加載?多QueryObjects?POCO?)

任何輸入,方向,或者對如何解決這些剩餘的需求,建議以及確保最佳性能非常感謝。

回答

1

您對查詢的大小和size of the result set are tangible的關注。

As @BrokenGlass提到EF不允許您在包含上進行過濾或排序。如果您想訂購或過濾關係,您必須使用投影方式以匿名類型或自定義(非映射)類型:

 var query = db.Leagues 
         .Where(l => l.URLPart.Equals(leagueName)) 
         .Select(l => new 
          { 
           League = l, 
           Events = l.LeagueEvents.Where(...) 
                .OrderBy(...) 
                .Take(3) 
                .Select(e => e.Event) 
           ... 
          }); 
+0

簡明而現貨!你的代碼示例正是我試圖完成的。我也提出了你的鏈接相關答案,以及它完全回答了我的問題關於足跡和性能的其餘部分。謝謝! –

0

不幸的是,EF不允許使用其導航屬性選擇性加載相關實體,如果您指定Include("Foo"),它將始終加載所有Foos

您必須在使用您的Where()子句的每個相關實體上進行連接,作爲它們應用的過濾器。