问题 Linq加入Include声明


IQueryable<Employee> emps = CreateObjectSet<Employee>()
                                  .Include(u => u.Departments)
                                  .AsQueryable();
IQueryable<Products> prods = CreateObjectSet<Products>().AsQueryable();

CreateObjectSet是ObjectContext的CreateObjectSetMethod

        return (from emp in emps
                join prod in prods
                on emp.ProductID equals prod.ProductID
                where emp.EmployeeID == 10
                select employee).ToList();

问题来自第一行,我使用include语句并包含员工的部门,其中返回值没有部门,因为它们从未包含在内。请提出一些建议。

这只是一个演示查询,实际查询是非常复杂的,所以请不要建议我不应该使用join语句,而是简单的include和where子句,这对我的方案不起作用。

谢谢


1271
2017-10-19 05:55


起源

是什么 CreateObjectSet 做?我怀疑是否需要 AsQueryable......不应该要求。 - Jon Skeet
@JonSkeet我认为原因是因为它返回了一个DBSet而OP最初使用的是var - johnny 5
@ johnny5:我看不出它在我们所展示的代码中是如何改变的。 - Jon Skeet
@JonSkeet如果 CreateObjectSet<Employee>() 返回一个 DbSet 和emps是一个var,之后对该变量进行操作将永远是一个DBSet,所以如果OP没有显示完整的代码并且他试图从另一个IQueryable进行赋值,那么它将失败。所以,如果你添加 AsQueryable 从一开始,你知道你的var是一个 IQueryable - johnny 5
@ johnny5:当我们不知道他们曾经使用过时,这听起来像是一大堆猜测 var我们也不知道他们曾试图为它分配另一个价值。 - Jon Skeet


答案:


这是包含的已知问题。您可以查看以下文章 包含在EF中

> var results =
>         ((from post in ctx.Posts
>         from blog in post.Blogs
>         where blog.Owner.EmailAddress == “alexj@microsoft.com”
>         select post) as ObjectQuery<Post>).Include(“Comments”);

如果该解决方案不适合您,您还可以尝试通过对数据进行分组并选择部门作为类型中的值之一来修复它。

然后,EF实体关系修复机制将为您“修复”包含。


14
2017-10-19 06:33



您指定的链接具有非常干净的解决方案。非常感谢 - manav inder
@Wouter包括在groupBy中保留并选择匿名,但是Joins不是为什么? - johnny 5


这可以通过以下代码解决:

var query = from emp in emps
            join prod in prods
            on emp.ProductID equals prod.ProductID
            where emp.EmployeeID == 10
            select employee;
var result = query.Include(u => u.Departments)

1
2017-12-06 05:02