設想
如果我首先拆分物體框架 linq 查詢以評估 IQerable,然后嘗試包含某些屬性,則最終將不包含“AccessGroupAccessPoints”和“AccessGroupAccessPoints.AccessPoint”的值。
public Task<List<AccessGroup>> GetAll(bool includeRelations)
{
var q = context.Set<AccessGroup>().AsNoTracking();
if (includeRelations)
{
q.Include(a => a.AccessGroupAccessPoints)
.ThenInclude(a => a.AccessPoint);
}
return q.ToListAsync();
}
我還嘗試洗掉 ThenInclude(),使用字串作為 Include() 的引數,移動 AsNoTracking() 以在之后解決...這些選項都不起作用。
public Task<List<AccessGroup>> GetAll(bool includeRelations)
{
var q = context.Set<AccessGroup>();
if (includeRelations)
{
q.Include("AccessGroupAccessPoints");
}
return q.AsNoTracking().ToListAsync();
}
解決方案
但是我找到了一個解決方案,如果在評估物件串列之前不拆分查詢,則物體框架包含預期的屬性。我希望它有所幫助。
public Task<List<AccessGroup>> GetAll(bool includeRelations)
{
if (includeRelations)
{
return context.Set<AccessGroup>()
.Include(a => a.AccessGroupAccessPoints).ThenInclude(a => a.AccessPoint)
.AsNoTracking()
.ToListAsync();
}
else
{
return context.Set<AccessGroup>().AsNoTracking().ToListAsync();
}
}
問題
為什么會發生?這是物體框架錯誤嗎?
uj5u.com熱心網友回復:
出于類似的原因,這不會對串列進行排序:
var x = new List<int> { 3, 2, 1 };
x.OrderBy(i => i);
Console.WriteLine(string.Join("|", x)); //prints 3,2,1
您需要捕獲并使用 OrderBy 的結果才能使其生效:
var x = new List<int> { 3, 2, 1 };
var y = x.OrderBy(i => i);
Console.WriteLine(string.Join("|", y)); //prints 1,2,3
在您的第一個代碼中,您 make q,然后呼叫Include()它,但不要使用 Include 的回傳值,并且 Include 不會修改q以使其成為執行包含的內容(就像在串列上呼叫 OrderBy 一樣不會) t 搖晃它的專案,使它們按順序排列)所以你為什么包括在內的知識丟失了..
..然而,在您的第二個代碼中,您在運行查詢時使用 Include 的回傳值(因為鏈)
也許你需要這樣的東西:
public Task<List<AccessGroup>> GetAll(bool includeRelations)
{
var q = context.AccessGroups.AsQueryable(); //so we can assign the IIncludableQueryable generated by Include.ThenInclude back to q
if (includeRelations)
{
q = q.Include(a => a.AccessGroupAccessPoints)
.ThenInclude(a => a.AccessPoint);
}
return q.ToListAsync();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/398325.html
