使用Entity Framework Core选择多个嵌套子表的级别

65

我想在Entity Framework Core使用急切加载获取多个嵌套级别的子表,我认为懒加载还没有实现。

我在这里找到了一个EF6的答案。

var company = context.Companies
                 .Include(co => co.Employees.Select(emp => emp.Employee_Car))
                 .Include(co => co.Employees.Select(emp => emp.Employee_Country))
                 .FirstOrDefault(co => co.companyID == companyID);

我的问题是EF Core中无法识别Select

Error CS1061 'Employees'不包含定义为'Select'的内容,也找不到接受类型为'Employees'的第一个参数的任何扩展方法'Select'(您是否缺少使用指令或程序集引用?)

我包含的名称空间:

using MyProject.Models;
using Microsoft.Data.Entity;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

在 EF Core 中,Select 的替代方法是什么?

2个回答

129
你可以使用关键字ThenInclude来代替。
例如:
var company = context.Companies
             .Include(co => co.Employees).ThenInclude(emp => emp.Employee_Car)
             .Include(co => co.Employees).ThenInclude(emp => emp.Employee_Country)
             .FirstOrDefault(co => co.companyID == companyID);

7
我疯了还是EF Core 1.1.0不再支持这个功能?使用"ThenInclude"时,父级被视为ICollection,导致我只能获得集合属性而不是单个元素的属性:/ - JasonX
31
这是IntelliSense的一个bug,只需像编写实体一样编写查询即可正常工作。 - Daniel Zolnai
@DanielZolnai 你有没有偶然报告这个 bug - 或者你是怎么发现它的?你有 GitHub 问题链接吗? - cdavid
1
@cdavid,这里在文档中列出,并且在github上这里。不相关的:很痛苦,我必须为来自同一子级(在您(firste)的情况下为“员工”)的孙子两次执行.Include。但是非常好的例子;谢谢。 - ruffin

5
此外,.ThenInclude仅适用于前三个级别的intellisense,例如:
_Context.A.Include(a => a.B).ThenInclude(B => B.C).ThenInclude(C => C.D)

那个声明的最后一部分是:
 .ThenInclude(C => C.D)

不会显示 "D",所以您需要自己输入 D,然后等待一段时间,直到编译错误消失!


1
使用dotnet 5和EF Core,智能感知在第三和第四级(可能还有更高级别)起作用。 - EGP
1
不错。终于到了! - Chris J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接