Linq to entities - 如何在entitycollection上選擇where條件的實體?

eager-loading entitycollection entity-framework linq-to-entities one-to-many

我發現有幾次人們要求同樣的問題,但似乎答案永遠不會令人滿意,儘管它應該很容易(理論上)。這是我的問題:

我有一個名為“Company”的實體,其中我有一個entityCollection“Employees”(一對多)。我需要檢索所有公司,對於每個公司,我只想要年齡超過21歲的員工。

我試過了 :

Return context.Companies.Include("Employees").Where(c => c.Employees.Where(e => e.Age > 21).Count() > 0)

這不起作用,因為它給了我每個公司的所有員工,如果至少有一個超過21(實際上是.Any())

我試過了 :

Return context.Companies.Include("Employees").Select(c => New Company {  
.Id = c.Id, 
.Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

這也沒有用(儘管它本來是完美的),它給了我以下錯誤: 實體或複雜類型'MyModel.Company'不能在LINQ to Entities查詢中構造。

你怎麼能選擇我所有的公司,每個公司只有21歲以上的員工?目前,我選擇所有,在客戶端,我過濾我的員工,但我不喜歡這個解決方案。

有誰能夠幫我 ?


謝謝Morteza Manavi-Parast,它會做的!

然而,我幾乎沒有說服自己在一個獨特的查詢中這樣做沒有在實體框架中實現。這是一個相對常見的情況......作為證明,在這個論壇上有很多類似我的問題。

我很驚訝......也許是為了下一個版本?


為了清楚起見,我需要一個公司列表,因為我直接將查詢結果綁定到數據網格。為了您的信息,當我點擊我的數據網格的一行(所以選擇一家公司)時,我有第二個Grid,其中填充了來自entityCollection的員工(21歲以上)。

一般承認的答案

在LINQ to Entities中無法使用包含“有條件的預先加載”。雖然存在2種解決方法。第一個是Filtered Projection ,它是Justin建議的那個,但在所有情況下都可能不合適,因為它提供了一組匿名類型對象。

第二種方式稱為兩個跟踪查詢 ,它為您提供了一系列強類型公司,其員工滿足條件,我相信這就是您所尋找的。這是它的代碼:

var companies = context.Companies.ToList();
var employees = context.Employee.Where(e => e.Age > 21);
foreach (var employee in employees) {
   companies.Single(c => c.CompanyID == employee.CompanyID).Employees.Add(employee);
}

請看另外一個例子, 條件Eager Loading


熱門答案

您是否嘗試選擇新的匿名類型,而不是使用類型公司:

Return context.Companies.Include("Employees").Select(c => New With {
    .Id = c.Id,
    .Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

(對不起,如果語法稍微偏離,那已經有一段時間了,因為我已經在VB.NET中完成了LINQ /匿名類型)



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因