2

我发现有好几次有人问同样的问题,但似乎答案从来都不是令人满意的,尽管它应该很容易(理论上)。这是我的问题:

我有一个名为“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()

这也不起作用(尽管它本来是完美的),它给了我以下错误:无法在 LINQ to Entities 查询中构造实体或复杂类型“MyModel.Company”。

你怎么能选择我所有的公司,每个公司的员工都在 21 岁以上?目前,我选择了所有,在客户端,我过滤了我的员工,但我不喜欢那个解决方案。

有谁能够帮我 ?


谢谢Morteza Manavi-Parast,它将完成工作!

尽管如此,我很难说服自己在唯一查询中这样做并没有在实体框架中实现。这是一个相对普遍的情况......作为证明,这个论坛上有很多像我这样的问题。

我很惊讶......也许下一个版本?


需要明确的是,我需要一个公司列表,因为我将查询结果直接绑定到数据网格。供您参考,当我单击数据网格的一行(因此选择一家公司)时,我有第二个网格,其中填充了来自 entityCollection 的员工(21 岁以上)。

4

3 回答 3

2

您是否尝试过选择新的匿名类型,而不是使用类型公司:

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/匿名类型了)

于 2010-10-12T12:58:48.577 回答
2

无法在 LINQ to Entities 中包含“有条件的急切加载”。虽然存在 2 种解决方法。第一个是过滤投影,它是贾斯汀建议的,但可能并非在所有情况下都可取,因为它提供了一组匿名类型对象。

第二种方法称为两次跟踪查询,它为您提供了一系列强类型公司,其员工满足条件,我相信这就是您正在寻找的。这是它的代码:

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

于 2010-10-12T14:45:39.760 回答
1

这个你可能想多了。如果您有 Company => Employee 关系双向映射,则只需使用 where 子句在 Employee 上进行选择并包括 company。

Return context.Employee.Include("Company").Where(e => e.Age > 21)
于 2010-10-12T13:01:45.207 回答