2

我發現有幾次人們問同樣的問題,但似乎答案從來沒有令人滿意,儘管它應該很容易(理論上)。這裏是我的問題:Linq to entities - 如何選擇實體集合上具有where條件的實體?

我有一個名爲「公司」的實體,其中我有一個entityCollection「Employees」(一對多)。我需要檢索的所有公司,併爲他們每個人,我只希望員工有年齡大於21

我想:

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

這並不工作,因爲它給了我所有的員工每個公司如果有至少一個21上方(它實際上比。任何相同的())

我想:

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

這並沒有工作,要麼(雖然它會一直perfe ct),它給了我以下錯誤:實體或複雜類型'MyModel.Company'不能在LINQ to Entities查詢中構造。

您如何才能選擇我所有的公司,而且每個公司的員工都超過21歲?目前,我選擇了所有客戶端,我篩選了我的員工,但我不喜歡該解決方案。

任何人都可以幫助我嗎?


謝謝Morteza Manavi-Parast,它會做的工作!儘管如此,我很難說服自己,在一個獨特的查詢中這樣做並沒有在Entity框架中實現。這是一個比較常見的情況......作爲證明,這個論壇上有很多像我一樣的問題。

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


要清楚,我需要公司的名單,因爲我直接結合我查詢到DataGrid的結果。對於您的信息,當我點擊一行數據網格(選擇一家公司)時,我有第二個網格,其中包含來自entityCollection的員工(21歲以上)。

+0

我很困惑,你是否想要返回一系列*公司*或*員工*?如果是後者,「公司」與你的查詢有什麼關係? (因爲你似乎正在獲取所有這些) – 2010-10-12 12:59:45

+0

在客戶端,我有一個數據網格綁定到直接來自此查詢的公司集合。 – Renaud 2010-10-12 13:30:43

回答

2

沒有辦法在LINQ to Entities中包含包含「Conditional Eager Loading」的條件。雖然存在兩種解決方法。第一個是已過濾的投影它是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); 
} 

另一個例子請看Conditional Eager Loading

2

而不是使用類型的公司,你有沒有嘗試選擇新的匿名類型:

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

(很抱歉,如果語法是有點偏離,它已經有一段時間,因爲我做了LINQ /匿名類型在VB.NET中)

+0

我無法使用匿名類型,因爲返回的列表直接綁定到Companies集合。我真的需要這裏的公司名單。 – Renaud 2010-10-12 13:29:13

1

你可能在想這個。如果您有雙向映射的Company => Employee關係,那麼只需使用where子句和包含公司對Employee進行選擇。

Return context.Employee.Include("Company").Where(e => e.Age > 21) 
+0

蒂姆,我有一個Datagrid在客戶端綁定到這個查詢的結果。我是上市公司,所以返回一份員工名單並不是一個好的選擇。 – Renaud 2010-10-12 13:25:52

+0

所以只需添加'.Select(emp => emp.Company).Distinct()'以Tim的建議和你離開去.. – quetzalcoatl 2017-05-19 10:26:37