簡體   English   中英

來自相關實體的EF Eager負載相關實體

[英]EF Eager load related entities from related entity

我在急於加載復雜的關系類型時遇到困難。 考慮我的實體:

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

僅包括對您正在做的事情的投影的作品。

在您的情況下,您正在定義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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM