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

Pet*_*nes 2 c# linq entity-framework lazy-loading

我有一些奇怪的行为,我无法弄清楚.

下面的两种方法应该从我理解的(显然是错误的)表现出与IQueryable相同的方式,但它们没有.

如果我使用IQueryable调用第一个(对象是来自实体框架的DbSet显式地用作IQueryable),它看起来好像不使用延迟加载(它在数据库上执行扫描).当我使用相同的对象调用第二个方法时,它似乎按照我想要的方式工作(它在数据库上执行搜索).

那么,有两个问题:

  • 为什么会这样?

  • 我(和如何)可以使最通用的方法(使用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);
}
Run Code Online (Sandbox Code Playgroud)

dle*_*lev 5

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