假设我有以下查询:
context.Orders.Where(predicate).Select(x => new { propA = x.PropA, propB = x.PropB}).ToList();
这是执行DB / ORM级别的where和select函数,只返回满足两个表达式的数据,还是返回满足谓词的所有结果,然后对那些执行select?
感谢。
答案 0 :(得分:1)
您正在使用IQueryable.Select
方法。所以它绝对被翻译成SQL。来自docs
Select<TSource, TResult>(IQueryable<TSource>, Expression<Func<TSource, TResult>>)
方法生成一个MethodCallExpression,表示调用Select<TSource, TResult>(IQueryable<TSource>, Expression<Func<TSource, TResult>>
)本身作为构造的泛型方法。然后,它将MethodCallExpression传递给源参数的Provider属性所表示的CreateQuery(Expression)
的{{1}}方法。
您可以使用探查器验证这一点。或者,尝试在IQueryProvider
中调用不受支持的方法,您将收到Select
的异常,该异常也会验证linq to entities does not recognize the method X
是否为Select
转换为SQL
而不是在内存中执行。
答案 1 :(得分:0)
它将在DB / ORM级别执行。只有在枚举IQueriable时才会获取查询结果,例如致电ToList()