Skip to content

Commit 1027f0a

Browse files
committed
Cast to underlying type of enum in equaling/ineqality expessions
1 parent bbe8fbe commit 1027f0a

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2020 Xtensive LLC.
1+
// Copyright (C) 2009-2021 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Alexis Kochetov
@@ -207,6 +207,30 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
207207
right = Visit(binaryExpression.Right);
208208
}
209209
}
210+
// Following two checks for enums are here to improve result query
211+
// performance because they let not to cast columns to integer.
212+
else if (binaryExpression.NodeType.In(ExpressionType.Equal, ExpressionType.NotEqual)
213+
&& binaryExpression.Left.StripCasts().Type.StripNullable().IsEnum
214+
&& binaryExpression.Right.StripCasts().NodeType == ExpressionType.Constant) {
215+
var rawEnum = binaryExpression.Left.StripCasts();
216+
217+
var typeToCast = (rawEnum.Type.IsNullable())
218+
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
219+
: rawEnum.Type.GetEnumUnderlyingType();
220+
left = Visit(Expression.Convert(rawEnum, typeToCast));
221+
right = Visit(Expression.Convert(binaryExpression.Right, typeToCast));
222+
}
223+
else if (binaryExpression.NodeType.In(ExpressionType.Equal, ExpressionType.NotEqual)
224+
&& binaryExpression.Right.StripCasts().Type.StripNullable().IsEnum
225+
&& binaryExpression.Left.StripCasts().NodeType == ExpressionType.Constant) {
226+
var rawEnum = binaryExpression.Right.StripCasts();
227+
228+
var typeToCast = (rawEnum.Type.IsNullable())
229+
? rawEnum.Type.StripNullable().GetEnumUnderlyingType().ToNullable()
230+
: rawEnum.Type.GetEnumUnderlyingType();
231+
left = Visit(Expression.Convert(rawEnum, typeToCast));
232+
right = Visit(Expression.Convert(binaryExpression.Left, typeToCast));
233+
}
210234
else {
211235
left = Visit(binaryExpression.Left);
212236
right = Visit(binaryExpression.Right);

0 commit comments

Comments
 (0)