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();

EF Eager从相关实体中加载相关实体

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();