簡體   English   中英

實體框架動態加載一些、沒有或所有導航屬性

[英]Entity Framework loading some, none or all navigation properties dynamically

查看此文檔,我可以看到您可以使用以下語法加載多個導航實體:

using (var context = new DbContext())
{
    var userDocs = context.UserDocuments
        .Include(userDoc => userDoc.Role.User)            
        .ToList();
}

這將使我的RoleUser導航屬性脫離我的UserDocument object,但是如果我想使用 Include 的字符串重載,我該如何構建代碼來處理多個包含?

這不起作用:

return await ctx.UserDocuments.Where(x => x.UserId == userId)
.Include("Role.User").ToList();

我正在嘗試這樣做,因為我的方法可能需要返回一些、全部或不返回導航屬性,具體取決於調用代碼。 我的目的是將一個字符串數組添加到存儲庫方法中,該方法將相應地構建任何所需的導航屬性。 如果這是錯誤的方法,有沒有人有其他建議,我想知道延遲加載是否是一個更優雅的解決方案......?

編輯

這是具有導航道具的實體:

public partial class UserDocument
{
  public int Id { get; set; }
  public Guid UserId { get; set; }
  public int RoleId { get; set; }
  public int AccountId { get; set; }
     
  public virtual Role Role { get; set; } = null!;
  public virtual User User { get; set; } = null!;
}

我想你正在尋找這樣的東西:

public async Task<List<UserDocument>> MyMethod(List<string> propertiesToInclude)
{
    IQueryable<UserDocument> currentQuery = _context.UserDocuments.Where(x => x.UserId == userId);
    
    foreach(var property in propertiesToInclude)
    {
        currentQuery = currentQuery.Include(property);
    }
    return await currentQuery.ToListAsync();
}

如果您使用的是Include(String)方法,則無需包含 lambda 即可指定屬性路徑。

而不是做.Include(x => "Role.User") ,嘗試.Include("Role.User")

首先,你必須告訴我們什么是“Role.User”? 如果我們不確切知道您寫了什么,我們無法回答您。

所以,現在我們知道這是兩個不同的實體,你可以做這個

var userDocs = await context.UserDocuments
    .Include(x => x.Role)
    .ThenInclude(x => x.User) 
    .ToListAsync();

我希望這對你有幫助。 :)

暫無
暫無

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

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