EF Eager从相关实体中加载相关实体
本文关键字:实体 加载 Eager EF | 更新日期: 2023-09-27 18:14:33
我在急切加载复杂关系类型时遇到困难。考虑我的实体:
public class User
{
public string UserName { get; set; }
}
public class Ownership
{
public User Owner { get; set; }
public Device Device { get; set; }
}
public class Device
{
public License License { get; set; }
}
假设所有实体都在单独的表中。我省略了所有不必要的约定代码。我可以在需要的时候发布更多。
我查询:
var result = return context.Ownerships
.Include(o => o.Device.License)
.Where(o => o.Owner.UserName == userName)
.Select(o => o.Device).ToList();
但是这会导致所有设备的null
值许可。但是,如果我像这样定义许可证:
public class Device
{
public virtual License License { get; set; }
}
和这样的查询:
var result = return context.Ownerships
.Where(o => o.Owner.UserName == userName)
.Select(o => o.Device).ToList();
它工作(许可证不是设备的null
),但我宁愿不惰性加载默认情况下。实体在rest上提供服务,因此,通过序列化,我可以获得我查询的每个设备的许可信息,这是我不需要的大量数据。
提示吗?
<解决方案/strong>
var result = return context.Ownerships
.Where(o => o.Owner.UserName == userName)
.Select(o => o.Device)
.Include(d => d.License)
.ToList();
Include只适用于你正在做的事情的投影。
在您的情况下,您正在定义Ownership
上的包含,但投影Device
上没有定义任何包含(例如.Include(o => o.Device.License)
不计数)。
你也许可以这样做(但我还没有测试过):
return context.Ownerships
.Where(o => o.Owner.UserName == userName)
.Select(o => o.Device)
.Include(d=>d.License)
.ToList();
如果不是反过来查询,例如:
return context.Devices
.Include(d => d.License)
.Where(d => d.Ownerships.Any(o=>o.Owner.UserName == userName))
.ToList();