实体框架投影到类比选择EF POCO对象更快,为什么?

时间:2011-09-28 17:35:07

标签: c# .net performance entity-framework-4.1 poco

这个让我很困惑。

我正在使用EF 4.1并且已经将T4模板应用于模型以使用POCO和POCO代理(公共无代表ctor,所有属性都是虚拟的,所有导航属性都是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 个答案:

答案 0 :(得分:4)

POCO代理只是代理。必须为每个代理类创建一个新的代理类并添加到上下文中。虽然你基本上已经说'不要在上下文中跟踪它们',但我认为它会更快一些,但我认为你正在创建另外一个代理的1.1M对象。

请注意:http://msdn.microsoft.com/en-us/library/dd456853.aspx

” 您可以混合使用POCO实体和代理实体对象。要禁用创建代理对象,请在ObjectContext上的ContextOptions属性返回的ObjectContextOptions实例上将ProxyCreationEnabled属性的值设置为false: “

通过ProxyCreationEnabled关闭上下文代理并查看结果是一个有趣的测试 - 我会收集类似的内容。