这个让我很困惑。
我正在使用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中。这在性能时间上是如此巨大的差异!我完全不知道为什么也不能提出任何合理的理由。
有谁知道为什么第二个陈述要快得多?
答案 0 :(得分:4)
POCO代理只是代理。必须为每个代理类创建一个新的代理类并添加到上下文中。虽然你基本上已经说'不要在上下文中跟踪它们',但我认为它会更快一些,但我认为你正在创建另外一个代理的1.1M对象。
请注意:http://msdn.microsoft.com/en-us/library/dd456853.aspx
” 您可以混合使用POCO实体和代理实体对象。要禁用创建代理对象,请在ObjectContext上的ContextOptions属性返回的ObjectContextOptions实例上将ProxyCreationEnabled属性的值设置为false: “
通过ProxyCreationEnabled关闭上下文代理并查看结果是一个有趣的测试 - 我会收集类似的内容。