|
1 | | -// Copyright (C) 2009-2020 Xtensive LLC. |
| 1 | +// Copyright (C) 2009-2021 Xtensive LLC. |
2 | 2 | // This code is distributed under MIT license terms. |
3 | 3 | // See the License.txt file in the project root for more information. |
4 | 4 | // Created by: Alexis Kochetov |
@@ -207,6 +207,30 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression) |
207 | 207 | right = Visit(binaryExpression.Right); |
208 | 208 | } |
209 | 209 | } |
| 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 | + } |
210 | 234 | else { |
211 | 235 | left = Visit(binaryExpression.Left); |
212 | 236 | right = Visit(binaryExpression.Right); |
|
0 commit comments