EF Eager从相关实体

时间:2015-09-24 12:52:42

标签: c# entity-framework

我急切地加载复杂的关系类型时遇到了困难。考虑我的实体:

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)但是我默认不是延迟加载。这些实体在休息时提供服务,因此,通过序列化,我获得了每个设备的许可证信息,我查询的是我不需要的线路上的大量数据。

任何提示?

解决方案

var result = return context.Ownerships
    .Where(o => o.Owner.UserName == userName)
    .Select(o => o.Device)
        .Include(d => d.License)
        .ToList();

1 个答案:

答案 0 :(得分:1)

仅包括对您正在进行的事物投影的工作。

在您的情况下,您定义了again上的包含,但预测while没有定义任何包含(例如Ownership不计算在内)。

您可以这样做(但我还没有测试过):

Device

如果没有改变您查询的方式,例如:

.Include(o => o.Device.License)