簡體   English   中英

EF:包括分組屬性

[英]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.

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