Skip to content

Commit 3613fc4

Browse files
committed
Improve contiditons when to rewrite binary expressions
1 parent 8200b5c commit 3613fc4

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,19 +209,21 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
209209
}
210210
// Following two checks for enums are here to improve result query
211211
// performance because they let not to cast columns to integer.
212-
else if (binaryExpression.Left.StripCasts().Type.StripNullable().IsEnum
213-
&& binaryExpression.Right.StripCasts().NodeType == ExpressionType.Constant) {
214-
var rawEnum = binaryExpression.Left.StripCasts();
212+
else if (EnumRewritableOperations(binaryExpression)
213+
&& binaryExpression.Left.StripCasts() is var rawLeft1 && rawLeft1.Type.StripNullable().IsEnum
214+
&& binaryExpression.Right.StripCasts() is var rawRight1 && rawRight1.NodeType == ExpressionType.Constant) {
215+
var rawEnum = rawLeft1;
215216

216217
var typeToCast = (rawEnum.Type.IsNullable())
217218
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
218219
: rawEnum.Type.GetEnumUnderlyingType();
219220
left = Visit(Expression.Convert(rawEnum, typeToCast));
220221
right = Visit(Expression.Convert(binaryExpression.Right, typeToCast));
221222
}
222-
else if (binaryExpression.Right.StripCasts().Type.StripNullable().IsEnum
223-
&& binaryExpression.Left.StripCasts().NodeType == ExpressionType.Constant) {
224-
var rawEnum = binaryExpression.Right.StripCasts();
223+
else if (EnumRewritableOperations(binaryExpression)
224+
&& binaryExpression.Right.StripCasts() is var rawRight2 && rawRight2.Type.StripNullable().IsEnum
225+
&& binaryExpression.Left.StripCasts() is var rawLeft2 && rawLeft2.NodeType == ExpressionType.Constant) {
226+
var rawEnum = rawRight2;
225227

226228
var typeToCast = (rawEnum.Type.IsNullable())
227229
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
@@ -253,6 +255,13 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
253255
}
254256

255257
return resultBinaryExpression;
258+
259+
static bool EnumRewritableOperations(BinaryExpression b)
260+
{
261+
return b.NodeType.In(ExpressionType.Equal, ExpressionType.NotEqual,
262+
ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual,
263+
ExpressionType.LessThan, ExpressionType.LessThanOrEqual);
264+
}
256265
}
257266

258267
protected override Expression VisitConditional(ConditionalExpression c)

0 commit comments

Comments
 (0)