为什么EF 6使用以下代码查询数据库中的所有记录?
public virtual List<T> Find(Func<T, bool> where = null)
{
_db.Configuration.LazyLoadingEnabled = false;
if (where == null) throw new NullReferenceException("The 'where' parameter of the Repository.Find() method is null.");
return _dbSet.Where(where).ToList();
}
生成以下输出
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Sequence] AS [Sequence],
[Extent1].[Description] AS [Description],
[Extent1].[Instructions] AS [Instructions],
[Extent1].[WorkCenterOperationId] AS [WorkCenterOperationId],
[Extent1].[JobId] AS [JobId],
[Extent1].[JobAssemblyId] AS [JobAssemblyId],
[Extent1].[RowVersion] AS [RowVersion]
FROM [dbo].[JobOperations] AS [Extent1]
两个问题:
答案 0 :(得分:8)
您使用的是Func<T,bool>
而不是Expression<Func<T,bool>>
,因此您强制(某处)从数据库Linq-Entities到Linq-to-Objects的转换。所以它在内存中处理。
而且,正如@Marc指出的那样,一个简单的修复可能是:
public virtual List<T> Find(Expression<Func<T, bool>> where = null)
...
但反过来,这取决于调用代码是否采用可以生成Func<T,bool>
或Expression<Func<T,bool>>
的形式(通常,lambda可以转换为任何一种形式)