2010-03-10 47 views
1

我想要做的事似乎很簡單。我想選擇一些僱主,我想包括按季度和季度降序排序的最後6個季度數據記錄。LINQ to Entities(實體框架)加入和包含衝突

考慮表達式:

var query = from e in data.Employer.Include("EmployerQuarterly") 
      where e.UIAccount == 22 
      select e; 

我在正確的軌道上,因爲我得到了7條僱主記錄,我想每一類又都的季度數據。現在我所要做的就是訂購這些數據,並只選擇前6條記錄。

該表達式實現由命令,但不查詢上述的6

var query = from e in data.Employer.Include("EmployerQuarterly") 
      from q in e.EmployerQuarterly 
      where e.UIAccount == 22 
      orderby q.Year descending, q.Quarter descending 
      select e; 

極限還具有兩個不期望的副作用。我現在取回208條記錄而不是我原來的7條,而且我不再收回任何EmployerQuarterly數據!

我不想犧牲我的渴望加載。我正在尋求可能的L2E嗎?

+0

如果您的問題僅僅是我如何根據標準x爲每個僱主獲得EmployerQuarterly的前七行? – TFD 2010-03-10 19:46:47

回答

6

您不能限制關係,因爲EF不會加載部分物化實體。所以如果你想加載相關數據的一個子集,你需要投影到POCO而不是加載實體。 I.e .:

var query = from e in data.Employer 
      where e.UIAccount == 22 
      select new 
      { 
       Id = e.Id, 
       Name = e.Name, 
       // etc. 
       Quarterlies = (from q in e.EmployerQuarterly 
           orderby q.Year descending, q.Quarter descending 
           select new 
           { 
            Id = q.Id, 
            // etc. 
           }).Take(6) 
      }; 

因爲你正在預測,你不再需要Include()

+0

我想避免投影,但這並沒有那麼糟糕。 – 2010-03-10 22:50:42

+0

您是否真的知道,如果我選擇新的{Employer = e,... {{在此處插入您的其他代碼},季度將自動由物化器滾動到僱主對象中?即我可以然後說result.Employer.First()。EmployerQuarterly.Count(),他們都在那裏就像我想要的那樣,儘管這不是我所要求的嗎? 非常令人驚歎的無證功能! – 2010-03-11 23:50:04

+0

是的,沒錯:http://blogs.msdn.com/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx – 2010-03-12 01:50:50