我有一个非常特殊的问题: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;
然而 Assets 仍然是 System.Data.Entities.DynamicProxies
的列表....
我以前从来没有遇到过这个问题。
最佳答案
原因是延迟加载。当在 EF 中启用延迟加载时(默认情况下),然后(同样,默认情况下)EF 为每个实体创建动态代理。它是加载相关实体所必需的。动态代理将从实体类继承。因此,在您的情况下,它将继承自 Asset
。但是动态代理将引用创建其实例的上下文。它将覆盖导航属性(虚拟的)以通过存储在动态代理中的上下文查询实体。
并且将派生类型的实例添加到基类型列表中是完全合法的。
如果您不需要动态代理,那么只需禁用延迟加载和代理创建:
ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation
从技术上讲,您可以关闭代理生成,延迟加载将不起作用。但我更喜欢明确关闭这两个设置。
关于c# - Linq ToList() 无法触发立即执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362032/