亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅當不為空時,如何使用 Include() 急切加載?

僅當不為空時,如何使用 Include() 急切加載?

C#
忽然笑 2022-06-19 16:26:12
我正在嘗試做:var abc = Context.PersonSet.Include(p=>p.Child).ToList();但并非所有人都有孩子。所以我得到:我想得到所有的人,如果孩子不為空,我想包括它。也可以將 Child 包含為 null。
查看完整描述

4 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

我不知道為什么人們一直支持這樣的解決方案:

Include(p => p.NavProp ?? new List<NavPropType>())

因為那行不通,所以對以下內容無效Include()

無效操作異常:

Include 屬性 lambda 表達式p => (p.NavProp ?? value(System.Collections.Generic.List'1[NavPropType]))無效。該表達式應表示屬性訪問:t => t.MyProperty。

要定位在派生類型上聲明的導航,請指定目標類型的顯式類型 lambda 參數,例如(Derived d) => d.MyProperty。有關包含相關數據的詳細信息,請參閱http://go.microsoft.com/fwlink/?LinkID=746393。

解決方案:使用默認值聲明您的屬性:

public class Foo{
    public List<Bar> Bars { get; set; } = new List<Bar>();}

這確保Bars不會null在沒有找到相關記錄時出現。


查看完整回答
反對 回復 2022-06-19
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

返回空子而不是 null

 Context.PersonSet.Include(a => ((a.Child == null) ? new Collection<Child>() : a.Child));



查看完整回答
反對 回復 2022-06-19
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

如果他們有任何孩子,您可以使用 GroupJoin 來獲取所有人并加載他們的孩子:(考慮在這種方法中,您應該在您的上下文中有 DbSet of Children)

Context.PersonSet.GroupJoin(Context.Children, p => p.Id, c => c.PersonId, (p, c) =>
                 new { Person = p, Child = c }).ToList();


查看完整回答
反對 回復 2022-06-19
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

例外不應該來自那條線。Include()應該使用LEFT JOIN完全符合您要求的 a :“我想獲取所有人員,如果孩子不為空,我想包括它”。要確認這一點,請檢查從 LINQ 生成的 SQL。

要解決此問題,請查看使用查詢結果的代碼abc并查看它是否正確處理Child集合(即檢查集合是否為空)。


查看完整回答
反對 回復 2022-06-19
  • 4 回答
  • 0 關注
  • 198 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號