使用实体框架和LINQ选择和筛选数据
本文关键字:选择 筛选 数据 LINQ 实体 框架 | 更新日期: 2023-09-27 18:29:11
假设我有以下查询:
context.Orders.Where(predicate).Select(x => new { propA = x.PropA, propB = x.PropB}).ToList();
这是在DB/ORM级别同时执行where和select函数,只返回满足这两个表达式的数据,还是返回满足谓词的所有结果,然后对这些结果执行select?
谢谢。
您使用的是IQueryable.Select
方法。所以它肯定被翻译成SQL
Select<TSource, TResult>(IQueryable<TSource>, Expression<Func<TSource, TResult>>)
方法生成MethodCallExpression,该MethodCallExpression表示调用Select<TSource, TResult>(IQueryable<TSource>, Expression<Func<TSource, TResult>>
)本身作为构造的泛型方法。然后,它将MethodCallExpression传递给由源参数的Provider属性表示的IQueryProvider
的CreateQuery(Expression)
方法。
您可以使用探查器对此进行验证。或者,尝试在Select
中调用一个不受支持的方法,您会得到一个异常,显示linq to entities does not recognize the method X
,它还验证Select
是否已转换为SQL
,并且未在内存中执行。
它将在DB/ORM级别同时执行这两个操作。查询结果仅在枚举IQuerable时获取,例如调用ToList()