EF Core
对于多层关系的及时加载(例如,孙子或祖父母关系),其中中间关系是集合(即与原始“主题”具有1到多的关系),EF Core具有一个新的扩展方法.ThenInclude()
,语法略有不同于旧版EF 4-6语法:
using Microsoft.EntityFrameworkCore;
...
var company = context.Companies
.Include(co => co.Employees)
.ThenInclude(emp => emp.Employee_Car)
.Include(co => co.Employees)
.ThenInclude(emp => emp.Employee_Country)
带有一些注释
- 如上所述(
Employees.Employee_Car
和Employees.Employee_Country
),如果您需要包括中间子集合的2个或更多子属性,您需要重复每个子集合的.Include
导航。
- 个人建议在
.ThenInclude
中保留额外的缩进,以保持清晰。
对于与原始主题是1:1(或N:1)的中介者的序列化,也支持点语法,例如
var company = context.Companies
.Include(co => co.City.Country)
这在功能上等同于:
var company = context.Companies
.Include(co => co.City)
.ThenInclude(ci => ci.Country);
然而,在EFCore中,使用“Select”链接一个与主题为1:N的中间层的旧的EF4 / 6语法
不受支持,即:
var company = context.Companies
.Include(co => co.Employee.Select(emp => emp.Address))
我将为您翻译关于编程的中文内容。以下是需要翻译的内容:
通常会导致类似于以下错误:
不支持'System.IntPtr'实例的序列化和反序列化
EF 4.1到EF 6
有一个强类型的.Include
,可以通过提供Select
表达式来指定所需的预加载深度:
using System.Data.Entity; // NB!
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);
生成的Sql语句并不直观,但似乎足够高效。我在
GitHub这里放了一个小例子。