2011-09-28 35 views
2

這個讓我困惑。實體框架投影到類比選擇EF POCO對象更快,爲什麼?

我正在使用EF 4.1並將模板應用於模型以使用POCO和POCO代理(公共無參考代理,所有屬性都是虛擬的,所有導航屬性均爲ICollection)。

我有一個表中有大約1.1M條記錄。我正在做一些時間測試,看看需要多長時間來檢索這些數據並得到一些意想不到的結果。

此調用返回在約21秒時:

ctx.Valuations.MergeOption = MergeOption.NoTracking 
var entityValuations = ctx.Valuations.OfType<Foo>().ToArray(); 

該呼叫需要9秒:

ctx.Valuations.MergeOption = MergeOption.NoTracking 
var entityValuations = ctx.Valuations.OfType<Foo>().Select(v => new Val() 
{ 
    ID = v.ID 
    ... 
    //set all properties 
    .... 
}).ToArray(); 

這兩個語句之間的唯一區別是,第一返回EF POCO代理和所述第二將結果集投影到非代理poco中。這就是性能時代的巨大差異!對於爲什麼而不能提出任何正當理由,我完全難以置信。

有沒有人知道爲什麼第二個陳述是如此之快?

+1

這是SQL緩存嗎?你運行過多少次?您是否清除了所有運行之間的緩存? – cjk

回答

4

POCO代理就是這樣 - 代理。必須爲每個代理類創建一個新代理類並將其添加到上下文中。雖然你基本上說'不在上下文中跟蹤它們',但我認爲你會創建額外的1.1M代理對象。

注來自:http://msdn.microsoft.com/en-us/library/dd456853.aspx

「 你可以有POCO實體和代理實體對象的混合要禁用創建的代理對象,ProxyCreationEnabled屬性的值設置爲false在返回ObjectContextOptions實例通過ObjectContext上的ContextOptions屬性: 「

這將是一個有趣的測試,通過ProxyCreationEnabled關閉上下文上的代理並查看結果是什麼 - 我會收集類似的結果。

+0

這也會讓我感興趣的是,禁用代理創建的性能如何! – Slauma