Linq ToList()无法触发立即执行

时间:2016-02-12 11:56:16

标签: c# entity-framework linq tolist

我遇到了一个非常特殊的问题:ToList()扩展方法无法将结果转换为列表。这是我的代码,标准样板linq查询,我转换ToList()两次以获得良好的衡量标准

var assets = new List<Asset>();

using (var ctx = new LeaseContext())
{
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList();

    assets.ToList();
}

return assets;

但资产仍然是System.Data.Entities.DynamicProxies ....

的列表

我之前从未遇到过这个问题。

1 个答案:

答案 0 :(得分:8)

原因是延迟加载。在EF中启用延迟加载(默认情况下),然后(再次,默认情况下),EF为每个实体创建动态代理。它是加载相关实体所必需的。动态代理将从实体类继承。因此,在您的情况下,它将继承自Asset。但是动态代理将引用创建其实例的上下文。它将覆盖通过存储在动态代理中的上下文查询实体的导航属性(它们是虚拟的)。

将派生类型的实例添加到基类型列表中是完全合法的。

如果您不想要动态代理,那么只需禁用延迟加载和代理创建:

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation

从技术上讲,您可以关闭代理生成,延迟加载将无法正常工作。但我更愿意明确地关闭这两个设置。