1

當通過關於實體框架MSDN相關實體裝載學習article去,我碰到了以下內容:是否包含加載所有相關實體或指定的實體?

也可以熱切負載相關 實體的多個級別。以下查詢顯示如何爲 收集和參考導航屬性執行此操作的示例。

... [實施例證明以上] ...

注意它目前不可能過濾哪些相關 實體被加載。包含將始終處於所有相關實體的 實體中。

這似乎有點混淆,因爲這兩個陳述似乎相互矛盾。我在這裏錯過了什麼嗎?

例如,我可以指定Mother導航屬性應包括爲每個ChildChildren DBSet我查詢,像這樣:

Dim myQuery = From children In context.Children.Include("Mother") 
       Select child 

這是否意味着Father導航屬性也將熱切地評估每Child

如果不是這種情況(Include只熱切加載你告訴它來),是有辦法,而不指定他們熱切負載所有導航性能?

+0

by ** not currentrly filtering **,其中一個意思是你不僅可以裝載母親少於30歲,你爲所選擇的孩子裝載所有母親。 – tschmit007

回答

3

是的,突出顯示這是一個有點混淆。而你的困惑也是因爲你碰巧專注於參考導航屬性。

看收藏清楚。

目前也不可以過濾其相關實體被加載

這意味着:你只能加載在孩子集合中的所有實體,不符合一定條件的實體。 絕不會裝載其他導航屬性,而不是在Include中指定的導航屬性。

Include方法從您顯示的字符串參數開始。後來加入的擴展方法,它允許通過表達式指定導航屬性:

context.Children.Include(c => c.Mother) 

尤其是當收集Include d:

context.Parents.Include(c => c.Children) 

似乎很自然的集合可以過濾:

context.Parents.Include(c => c.Children.Where(x => x.IsActive)) 

它編譯,但這是不可能的(運行時異常)。原因是該表達式僅用於獲取nav屬性的名稱,以便調用原始的Include方法(使用字符串參數)。

我認爲這就是爲什麼這個限制在你提到的帖子中強調的原因。


有沒有辦法來急切地加載所有的導航性能,而無需指定他們

沒有,沒有。這將是「危險的」,因爲有很多Includes是一個真正的性能殺手。您最好仔細指定Includes

+0

在那個筆記上,你完全可以寫一個擴展方法來包含所有的導航屬性(不管它可能是一個壞主意) –

+0

@LukeMcGregor當然。我認爲OP正在尋找一個開箱即用的解決方案。 IIRC在這裏提供了這樣的擴展方法的答案。但是,我再次不會使用它們。模型中一個無辜的外觀變化可能會產生戲劇性的效果,而這些變化並不是預期的。 –

相關問題