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

标签 c# entity-framework linq

我有一个非常特殊的问题: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/

相关文章:

c# - Entity Framework 中实体的内部访问使得查询崩溃时的简单 linq

c# - 如何过滤相同类型的嵌套实体?

c# - 在 DbSet 中创建预过滤层

c# - 当我的应用程序使用不同的 appsettings 文件时,为什么 AspNetCore Identity 脚手架不会加载其关联的 CSS 和 JS 文件?

c# - Entity Framework - groupby 和时间跨度计算

c# - 使用 Entity Framework 将 MySQL 记录写入数组

c# - 比较两个列表以搜索常见项目

c# - 如何为 BackgroundService 的 ExecuteAsync 设置超时?

c# - 如何自定义和重用 DataGridColumnHeader 样式?

mysql - 两个外键引用一个表和可为空的外键