c# - IEnumerable/IQueryable 扩展的奇怪行为(没有延迟加载?)

标签 c# linq entity-framework lazy-loading

我有一些我无法理解的奇怪行为。

根据我的理解(这显然是错误的),下面的两种方法在给定 IQueryable 的情况下应该以相同的方式运行,但它们不是。

如果我用 IQueryable 调用第一个(该对象是 Entity Framework 中明确用作 IQueryable 的 DbSet),它看起来没有使用延迟加载(它对数据库执行扫描)。当我用同一个对象调用第二个方法时,它似乎按照我想要的方式工作(它在数据库上执行搜索)。

那么,两个问题:

  • 为什么会这样?

  • 我能否(以及如何)使最通用的方法(使用 IEnumerable)“正常”工作? (因为我有更多的扩展,不想重复代码,所以我想避免重载,只是像下面那样复制粘贴方法体)

我正在使用 EF 4.1 处理 SQL Server Express 2008 数据库

public static TEntity GetByID<TEntity>(this IEnumerable<TEntity> list, long id) where TEntity : Identifiable
{
   return list.SingleOrDefault(e => e.ID == id);
}

public static TEntity GetByID<TEntity>(this IQueryable<TEntity> list, long id) where TEntity : Identifiable
{
    return list.SingleOrDefault(e => e.ID == id);
}

最佳答案

IEnumerable<T>不会将查询表达式传递给 EF LINQ 提供程序,而是执行 SingleOrDefault()在内存中。这需要将表完全加载到内存中,然后是 SingleOrDefault() .通过使用 IQueryable<T>版本,为提供者提供了正确的表达式树,它将其转换为您想要的 SQL。这就是差异的来源。

关于c# - IEnumerable/IQueryable 扩展的奇怪行为(没有延迟加载?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6849240/

相关文章:

c# - Entity Framework -使用存储过程急于加载对象图

c# - 客户端模型应使用哪些数据类型与 Azure 移动应用 SDK 进行离线同步?

c# - ASP.NET MVC4 实体验证错误 : User name already taken

c# - 如何从 List() 中获取整数值的运行总计?

c# - 将 if(x) Foreach() 替换为 Foreach.Where(x)

c# - 使用 lambda 从列表的另一个属性填充列表的属性?

entity-framework - 为什么 Entity Framework 使用 “set transaction isolation level read committed”,这意味着什么?

c# - StringBuilder 附加字节而不格式化

C# 可以为链接抓取 webBrowser 控件吗?

c# - 使用 linq 进行动态查询