我有一些我无法理解的奇怪行为。
根据我的理解(这显然是错误的),下面的两种方法在给定 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/