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