[英]EF: Include property on grouping
大查詢后,我具有以下分組類型:
IQueryable<IGrouping<Type1, IGrouping<Type2, Type3>> result;
var executedQuery = result
.Include(a => a.Select(b => b.Select(c => c.Type3Property)))
.ToList();
我也嘗試了SelectMany,但總是收到以下錯誤:
EntityFramework.dll中發生類型'System.ArgumentException'的異常,但未在用戶代碼中處理
附加信息:包含路徑表達式必須引用在類型上定義的導航屬性。 使用虛線路徑作為參考導航屬性,使用“選擇”運算符作為集合導航屬性。
我無法在查詢中使用“包含”,因為在分組之前它不起作用。
當我進行搜索時,似乎每個人都可以使用Select來與收藏集配合使用,我的問題是什么?
包含應該始終可轉換為字符串重載Include("PropertyX")
。 這意味着Select
語句中lambda表達式的成員表達式必須包含尋址類型的屬性。 例如:
context.Companies.Include(c => c.Employees);
在這里, Employees
是在 Company
類型上定義的導航屬性 。 EF唯一要做的就是獲取成員表達式c.Employees
,然后在內部執行Include
字符串參數的Include
語句。
現在,您將了解這不適用於您的lambda表達式:
b => b.Select(c => c.Type3Property))
它不包含屬性,但包含后續的Select
語句,更不用說導航屬性了 。
因此,您只能直接在IQueryable<TEntity>
上使用Include
(顯然,其中TEntity
是EF類模型中的類型)。 並且 ,由於您在此處進行了分組,如果在應用查詢形狀后對其進行了更改,則將忽略[ Includes
]]( 為什么“包括不起作用”? )。 我認為就您而言,這意味着您甚至無法使用Include
。
旁注:在我自己的代碼中,我總是竭盡全力避免濫用。 就像“我們擁有這個屬性X
,我們也將它用作...的信號”一樣。 並且引入了棘手的依賴性和副作用的來源。 我可以理解,EF決定將lambda表達式用於可編譯時可檢查的Include
重載,但這引起了令人難以置信的混亂。 只允許您使用lambda做的所有事情的1%。 其他99%會編譯,但會拋出運行時異常。
為了解決我的問題,我在匿名對象的查詢中顯式選擇了Type3的屬性:
result.Select(g => new
{
Key = g.Key,
Value = g.SelectMany(e => e.Select(x=> new
{
RootObject = x,
Child1= x.prop1,
Childe2 = x.prop2
}))
}).ToList();
即使我僅使用根對象,這實際上也會加載子級。 它不是很漂亮,但是解決了我的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.