如果集合Root
實體不是太大,你可以嘗試明確加載(語法DbContext
):
var roots = context.Roots.Where(someCondition).ToList();
foreach (var root in roots)
root.Children = context.Entry(root).Collection(r => r.Children)
.Query().ToList();
這適用於任何類型的關係,包括許多一對多的關係。有1 + N個查詢,如果N太大,與預期加載相比,性能可能會適得其反。
如果Root
和Child
之間的關係是不多到許多您可以利用關係Fixup時其是確保了對象圖時自動建立的上下文(ObjectContext
或DbContext
)的特徵實體得到加載到或附加到上下文:(我假設這裏Child
具有逆導航屬性Root
)
var roots = context.Roots.Where(someCondition).ToList();
var rootIds = roots.Select(r => r.Id);
context.Children.Where(c => rootIds.Contains(c.Root.Id)).Load();
這些始終是兩個查詢,無論加載多少個Root
個實體。關係Fixup時將自動填充root.Children
收集每一個連接root
,這樣的結果看起來彷彿您使用了預先加載:
var roots = context.Roots.Include("Children").Where(someCondition).ToList();
不幸的是,Contains
方法是緩慢的,如果rootIds
收集大:https://stackoverflow.com/a/8108643/270591。但是,使用預先加載時,數據重複造成的性能下降可能會比rootIds
更好。
選擇其中一個替代方案是一個考驗問題。我無法給出一般性建議來使用適用於所有情況的一種或另一種選擇。
你使用存儲過程嗎? –
不,只是查詢。 SP是靜態的,我知道EF 5支持SP中的MRS,但我正在尋找優化有關返回數據大小的查詢的方式。 –
你看過編譯查詢嗎? http://msdn.microsoft.com/en-us/library/bb896297.aspx –