使用实体框架和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?

谢谢。

使用实体框架和LINQ选择和筛选数据

您使用的是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属性表示的IQueryProviderCreateQuery(Expression)方法。

您可以使用探查器对此进行验证。或者,尝试在Select中调用一个不受支持的方法,您会得到一个异常,显示linq to entities does not recognize the method X,它还验证Select是否已转换为SQL,并且未在内存中执行。

它将在DB/ORM级别同时执行这两个操作。查询结果仅在枚举IQuerable时获取,例如调用ToList()