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
谓词。
我重写了一些数据库访问代码,以节省一些周期。我的主要目标是尽可能多地对我的 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
谓词。