这可能是一个真正的元素问题,但是当编写一个跨越三个级别(或更多)的查询时,什么是包含多个子实体的好方法呢?
例如,我有4张表:Company
、Employee
、Employee_Car
和Employee_Country
公司与员工之间的关系为1:m。
雇员与雇员_汽车和雇员_国家都具有1:m关系。
如果我想写一个查询,返回所有4个表的数据,我目前正在写:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
必须有一个更优雅的方法!这是冗长的,并产生可怕的SQL
我在VS 2010中使用EF 4
6条答案
按热度按时间6kkfgxo01#
使用extension methods。将 NameOfContext 替换为对象上下文的名称。
然后你的代码变成
wqsoz72f2#
EF核心
对于多于一个导航的急切加载关系(例如,孙子或祖父关系),其中中间关系是集合(即,具有原始“subject”的1对多),EF Core具有新的扩展方法
.ThenInclude()
,并且语法是旧EF 4-6语法的slightly different:加上一些注解
Employees.Employee_Car
和Employees.Employee_Country
),如果需要包含中间子集合的2个或更多子属性,则you'll need to repeat为集合的每个子集合提供.Include
导航。.ThenInclude
中保留额外的“缩进”,以保持您的理智。对于与原始主题为1:1(或N:1)的中介体的串行化,也支持点语法,例如:
这在功能上等同于:
但是,在EFCore中,使用“Select”通过与主题为1:N的中介链接的旧EF 4/ 6语法不受支持,即
通常会导致模糊错误,如
不支持“System.IntPtr”示例的序列化和反序列化
EF 4.1至EF 6
有一个strongly typed
.Include
,它允许通过提供Select
表达式到适当的深度来指定所需的急切加载深度:生成的Sql一点也不直观,但看起来性能足够好。
cdmah0mi3#
您可能会对这篇文章感兴趣,它可以在codeplex.com上找到。
本文提出了一种新的方法,以声明性图形的形式表示跨多个表的查询。
此外,本文还将这种新方法与EF查询进行了全面的性能比较,分析表明GBQ的性能很快就优于EF查询。
im9ewurl4#
How do you construct a LINQ to Entities query to load child objects directly, instead of calling a Reference property or Load()
没有其他方法--除了实现延迟加载。
或手动加载....
llew8vvj5#
可能会帮助一些人,4级和2个孩子的每一级
tct7dpnv6#
为此:
此扩展可能有帮助: