2012-12-27 65 views
1

當我查詢實體並添加許多包含到我的查詢數據非規範化。
許多行包含的數據只有幾列不同,而其他列包含相同的數據。
在我開始使用ORM之前,我更願意編寫幾個查詢並接收手動組裝複雜對象的多個結果集。雖然最佳方法取決於模式,返回記錄的數量和實體的複雜性。
Can Entity Framework可以使用包含多個結果集嗎?

我想知道EF是否支持實例化複雜實體的第二種方式,以及如何開啓此模式。

更新

更清楚,我會誇張一點。

假設我們有實體A由100個簡單屬性組成:字符串,插入點,日期等。除了這些屬性實體包含一個非常大的實體集合B

讓我們考慮查詢:

context.ASet.Include("CollectionOfB"); 

對於包含在收集服務器的每個項目B返回的簡單性質的許多重複。

沒有ORM我創建查詢但只詢問根對象的ID。然後我查詢根對象,然後查詢引用根對象ID的依賴關係。
然後我用字典和散列集處理MARS來組裝實體。

+0

你使用存儲過程嗎? –

+0

不,只是查詢。 SP是靜態的,我知道EF 5支持SP中的MRS,但我正在尋找優化有關返回數據大小的查詢的方式。 –

+0

你看過編譯查詢嗎? http://msdn.microsoft.com/en-us/library/bb896297.aspx –

回答

2

如果集合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太大,與預期加載相比,性能可能會適得其反。

如果RootChild之間的關係是多到許多您可以利用關係Fixup時其是確保了對象圖時自動建立的上下文(ObjectContextDbContext)的特徵實體得到加載到或附加到上下文:(我假設這裏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更好。

選擇其中一個替代方案是一個考驗問題。我無法給出一般性建議來使用適用於所有情況的一種或另一種選擇。

+0

早些時候,我使用屬性中的fixups生成了實體類。它與Relation Fixup還是不一樣的。並且這項針對殘疾人士的工作會改變追蹤嗎 –

+1

@voroninp:不,它不一樣。我的意思是「關係修復」與生成的實體中的屬性修復代碼無關。它是適用於所有類型實體和所有EF版本的上下文核心功能。不,它不適用于禁用更改跟蹤。對不起,我忘了首先強調它。 – Slauma

相關問題