@@ -49,7 +49,8 @@ public static void BuildFilter(IndexInfo index)
49
49
50
50
protected override Expression VisitBinary ( BinaryExpression b )
51
51
{
52
- if ( EnumRewritableOperations ( b ) ) {
52
+ var nodeType = b . NodeType ;
53
+ if ( EnumRewritableOperations ( nodeType ) ) {
53
54
var leftNoCasts = b . Left . StripCasts ( ) ;
54
55
var leftNoCastsType = leftNoCasts . Type ;
55
56
var bareLeftType = leftNoCastsType . StripNullable ( ) ;
@@ -63,7 +64,7 @@ protected override Expression VisitBinary(BinaryExpression b)
63
64
: leftNoCastsType . GetEnumUnderlyingType ( ) ;
64
65
65
66
return base . VisitBinary ( Expression . MakeBinary (
66
- b . NodeType ,
67
+ nodeType ,
67
68
Expression . Convert ( leftNoCasts , typeToCast ) ,
68
69
Expression . Convert ( b . Right , typeToCast ) ) ) ;
69
70
}
@@ -73,31 +74,30 @@ protected override Expression VisitBinary(BinaryExpression b)
73
74
: rightNoCastsType . GetEnumUnderlyingType ( ) ;
74
75
75
76
return base . VisitBinary ( Expression . MakeBinary (
76
- b . NodeType ,
77
+ nodeType ,
77
78
Expression . Convert ( rightNoCasts , typeToCast ) ,
78
79
Expression . Convert ( b . Left , typeToCast ) ) ) ;
79
80
}
80
81
}
81
82
82
83
// Detect f!=null and f==null for entity fields
83
84
84
- if ( ! ( b . NodeType is ExpressionType . Equal or ExpressionType . NotEqual ) )
85
- return base . VisitBinary ( b ) ;
86
-
87
- var left = Visit ( b . Left ) ;
88
- var right = Visit ( b . Right ) ;
89
-
90
- if ( entityAccessMap . TryGetValue ( left , out var field ) && IsNull ( right ) )
91
- return BuildEntityCheck ( field , b . NodeType ) ;
92
- if ( entityAccessMap . TryGetValue ( right , out field ) && IsNull ( left ) )
93
- return BuildEntityCheck ( field , b . NodeType ) ;
94
- if ( entityAccessMap . TryGetValue ( left , out var _ ) && entityAccessMap . TryGetValue ( right , out var _ ) )
95
- throw UnableToTranslate ( b , Strings . ComparisonOfTwoEntityFieldsIsNotSupported ) ;
85
+ if ( nodeType is ExpressionType . Equal or ExpressionType . NotEqual ) {
86
+ var left = Visit ( b . Left ) ;
87
+ var right = Visit ( b . Right ) ;
96
88
89
+ bool hasLeftField , hasRightField ;
90
+ if ( ( hasLeftField = entityAccessMap . TryGetValue ( left , out var field ) ) && IsNull ( right )
91
+ || ( hasRightField = entityAccessMap . TryGetValue ( right , out field ) ) && IsNull ( left ) ) {
92
+ return BuildEntityCheck ( field , nodeType ) ;
93
+ }
94
+ if ( hasLeftField && hasRightField )
95
+ throw UnableToTranslate ( b , Strings . ComparisonOfTwoEntityFieldsIsNotSupported ) ;
96
+ }
97
97
return base . VisitBinary ( b ) ;
98
98
99
- static bool EnumRewritableOperations ( BinaryExpression b ) =>
100
- b . NodeType is ExpressionType . Equal or ExpressionType . NotEqual or ExpressionType . GreaterThan or ExpressionType . GreaterThanOrEqual
99
+ static bool EnumRewritableOperations ( ExpressionType nodeType ) =>
100
+ nodeType is ExpressionType . Equal or ExpressionType . NotEqual or ExpressionType . GreaterThan or ExpressionType . GreaterThanOrEqual
101
101
or ExpressionType . LessThan or ExpressionType . LessThanOrEqual ;
102
102
}
103
103
0 commit comments