我有類似如下的模式:如何在Entity Framework中一次爲多個模型顯式加載關係?
class Parent {
public int Id { get; set; }
public string Name { get;set; }
public ICollection<Child> Children { get; set; }
public GrandChildren SpecialGrandChild {
get {
return Children.SelectMany(c => c.Children).Where(...).Single();
}
}
}
class Child {
public int Id { get; set; }
public int ParentId { get; set; }
public Parent Parent { get; set; }
public ICollection<GrandChild> Children { get; set; }
}
class GrandChild {
public int Id { get; set; }
public string Name { get;set; }
public int ParentId { get; set; }
public Child Parent { get; set; }
}
我也有一個涉及所有三個表相當複雜的查詢。從該查詢中,我想提取所有Parent
對象,並且我將爲每個對象顯示SpecialGrandChild
的屬性。
的問題是,如果我這樣做:
query.Include(p => p.Children.Select(c => c.Children));
EF會產生不敬虔的SQL查詢,並採取了大量的時間來構建查詢(在某些情況下超過10秒!)。查詢被緩存,所以進一步的調用要快得多。如果我放棄撥打Include
的電話,我不會得到如此糟糕的首次通話表現,但當然我的表現會變差,因爲我會在做M*N+1
查詢(對於每個父母,取孩子,並且爲每個孩子取孩子的GrandChildren )。
所以問題是:我可以在一次調用中爲所有加載的父母顯式加載所有Children和GrandChildren嗎?如果是這樣,我該怎麼做?
我試着查詢所有的童車當前加載的父母如下:
var ids = parents.Select(p => p.Id);
(from c in Childs where ids.Contains(c.ParentId) select c).Include("Children").Load();
但這一呼籲並沒有告訴EF所有相關的童車被加載的,因此還是到DB當我訪問關聯屬性。
這使我蒙受沉重的成本彙編,兩次:( – felipe
你試過底部''''查詢包含(「Parent.Parent」); ' –
雖然請求數少,但編譯時間仍然很短 – felipe