LINQ Where子句常量表达式优化

LINQ Where clause constant expression optimization

我重写了一些数据库访问代码,以节省一些周期。我的主要目标是尽可能多地对我的 LINQ 查询进行服务器端评估。 为此,我替换了这个:

data = ...some LINQ...
if(condition){
    data = data.Where(element => filter-condition)
}

有了这个:

data = ...some LINQ...
.Where(element => !condition || filter-condition)

condition 在这种情况下是一个不依赖于当前元素的表达式。所以你可以说它在整个查询期间实际上是一个常量,因为它总是对 data 中的所有元素求值为真,或者对所有元素求值为假。

另一方面,filter-condition 是一个依赖于当前元素的表达式,正如您对通常的 Where 子句条件所期望的那样。

这个优化很有魅力,因为它可以在数据库 SQL 中启用服务器端评估,并且 LINQ to SQL 编译器足够智能,甚至可以短路生成的 SQL 如果我的 condition 计算结果为假。 我的问题是,如果此代码未在服务器端的 SQL 中求值,会发生什么情况。可以说我会做以下事情:

data = ...some LINQ...
.AsEnumerable()    //Enforces client-side query evaluation
.Where(element => !condition || filter-condition)

现在我的 Where 子句在客户端进行评估,这在功能方面不是问题。当然,客户端执行的性能较弱。但是我之前做的自定义优化呢?为我的数据序列中的每个元素评估 condition 是否有性能损失?或者客户端的 LINQ 是否也足够智能,可以短路“常量”表达式 condition?

Or is LINQ on client-side also intelligent enough, to short-circuit the "constant" expression condition?

有点。 || 总是在 C# 中进行短路评估,但客户端上的 LINQ 没有任何类型的查询优化器,因此将为每个实体评估 !condition || filter-condition 谓词。