Skip to content

Commit 1ad55df

Browse files
committed
Less Expression.Type calls
1 parent 98882b2 commit 1ad55df

File tree

2 files changed

+30
-27
lines changed

2 files changed

+30
-27
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/PartialIndexFilterBuilder.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,31 @@ public static void BuildFilter(IndexInfo index)
4747
protected override Expression VisitBinary(BinaryExpression b)
4848
{
4949
if (EnumRewritableOperations(b)) {
50-
var bareLeft = b.Left.StripCasts();
51-
var bareLeftType = bareLeft.Type.StripNullable();
52-
var bareRight = b.Right.StripCasts();
53-
var bareRightType = bareRight.Type.StripNullable();
54-
55-
if (bareLeftType.IsEnum && bareRight.NodeType == ExpressionType.Constant) {
56-
var typeToCast = bareLeft.Type.IsNullable()
50+
var leftNoCasts = b.Left.StripCasts();
51+
var leftNoCastsType = leftNoCasts.Type;
52+
var bareLeftType = leftNoCastsType.StripNullable();
53+
var rightNoCasts = b.Right.StripCasts();
54+
var rightNoCastsType = rightNoCasts.Type;
55+
var bareRightType = rightNoCastsType.StripNullable();
56+
57+
if (bareLeftType.IsEnum && rightNoCasts.NodeType == ExpressionType.Constant) {
58+
var typeToCast = leftNoCastsType.IsNullable()
5759
? bareLeftType.GetEnumUnderlyingType().ToNullable()
58-
: bareLeft.Type.GetEnumUnderlyingType();
60+
: leftNoCastsType.GetEnumUnderlyingType();
5961

6062
return base.VisitBinary(Expression.MakeBinary(
6163
b.NodeType,
62-
Expression.Convert(bareLeft, typeToCast),
64+
Expression.Convert(leftNoCasts, typeToCast),
6365
Expression.Convert(b.Right, typeToCast)));
6466
}
65-
else if (bareRightType.IsEnum && bareLeft.NodeType == ExpressionType.Constant) {
66-
var typeToCast = bareRight.Type.IsNullable()
67+
else if (bareRightType.IsEnum && leftNoCasts.NodeType == ExpressionType.Constant) {
68+
var typeToCast = rightNoCastsType.IsNullable()
6769
? bareRightType.GetEnumUnderlyingType().ToNullable()
68-
: bareRight.Type.GetEnumUnderlyingType();
70+
: rightNoCastsType.GetEnumUnderlyingType();
6971

7072
return base.VisitBinary(Expression.MakeBinary(
7173
b.NodeType,
72-
Expression.Convert(bareRight, typeToCast),
74+
Expression.Convert(rightNoCasts, typeToCast),
7375
Expression.Convert(b.Left, typeToCast)));
7476
}
7577
}

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

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -210,24 +210,25 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
210210
else if (EnumRewritableOperations(binaryExpression)) {
211211
// Following two checks for enums are here to improve result query
212212
// performance because they let not to cast columns to integer.
213-
214-
var bareLeft = binaryExpression.Left.StripCasts();
215-
var bareLeftType = bareLeft.Type.StripNullable();
216-
var bareRight = binaryExpression.Right.StripCasts();
217-
var bareRightType = bareRight.Type.StripNullable();
218-
219-
if (bareLeftType.IsEnum && bareRight.NodeType == ExpressionType.Constant) {
220-
var typeToCast = bareLeft.Type.IsNullable()
213+
var leftNoCasts = binaryExpression.Left.StripCasts();
214+
var leftNoCastsType = leftNoCasts.Type;
215+
var bareLeftType = leftNoCastsType.StripNullable();
216+
var rightNoCasts = binaryExpression.Right.StripCasts();
217+
var rightNoCastsType = rightNoCasts.Type;
218+
var bareRightType = rightNoCastsType.StripNullable();
219+
220+
if (bareLeftType.IsEnum && rightNoCasts.NodeType == ExpressionType.Constant) {
221+
var typeToCast = leftNoCastsType.IsNullable()
221222
? bareLeftType.GetEnumUnderlyingType().ToNullable()
222-
: bareLeft.Type.GetEnumUnderlyingType();
223-
left = Visit(Expression.Convert(bareLeft, typeToCast));
223+
: leftNoCastsType.GetEnumUnderlyingType();
224+
left = Visit(Expression.Convert(leftNoCasts, typeToCast));
224225
right = Visit(Expression.Convert(binaryExpression.Right, typeToCast));
225226
}
226-
else if (bareRightType.IsEnum && bareLeft.NodeType == ExpressionType.Constant) {
227-
var typeToCast = (bareRight.Type.IsNullable())
227+
else if (bareRightType.IsEnum && leftNoCasts.NodeType == ExpressionType.Constant) {
228+
var typeToCast = rightNoCastsType.IsNullable()
228229
? bareRightType.GetEnumUnderlyingType().ToNullable()
229-
: bareRight.Type.GetEnumUnderlyingType();
230-
left = Visit(Expression.Convert(bareRight, typeToCast));
230+
: rightNoCastsType.GetEnumUnderlyingType();
231+
left = Visit(Expression.Convert(rightNoCasts, typeToCast));
231232
right = Visit(Expression.Convert(binaryExpression.Left, typeToCast));
232233
}
233234
else {

0 commit comments

Comments
 (0)