@@ -46,31 +46,33 @@ public static void BuildFilter(IndexInfo index)
4646
4747 protected override Expression VisitBinary ( BinaryExpression b )
4848 {
49- if ( b . Left . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
50- && b . Right . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
51-
52- var rawEnum = b . Left . StripCasts ( ) ;
53- var typeToCast = ( rawEnum . Type . IsNullable ( ) )
54- ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
55- : rawEnum . Type . GetEnumUnderlyingType ( ) ;
56-
57- return base . VisitBinary ( Expression . MakeBinary (
58- b . NodeType ,
59- Expression . Convert ( rawEnum , typeToCast ) ,
60- Expression . Convert ( b . Right , typeToCast ) ) ) ;
61- }
62- else if ( b . Right . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
63- && b . Left . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
64-
65- var rawEnum = b . Right . StripCasts ( ) ;
66- var typeToCast = ( rawEnum . Type . IsNullable ( ) )
67- ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
68- : rawEnum . Type . GetEnumUnderlyingType ( ) ;
69-
70- return base . VisitBinary ( Expression . MakeBinary (
71- b . NodeType ,
72- Expression . Convert ( rawEnum , typeToCast ) ,
73- Expression . Convert ( b . Left , typeToCast ) ) ) ;
49+ if ( EnumRewritableOperations ( b ) ) {
50+ if ( b . Left . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
51+ && b . Right . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
52+
53+ var rawEnum = b . Left . StripCasts ( ) ;
54+ var typeToCast = ( rawEnum . Type . IsNullable ( ) )
55+ ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
56+ : rawEnum . Type . GetEnumUnderlyingType ( ) ;
57+
58+ return base . VisitBinary ( Expression . MakeBinary (
59+ b . NodeType ,
60+ Expression . Convert ( rawEnum , typeToCast ) ,
61+ Expression . Convert ( b . Right , typeToCast ) ) ) ;
62+ }
63+ else if ( b . Right . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
64+ && b . Left . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
65+
66+ var rawEnum = b . Right . StripCasts ( ) ;
67+ var typeToCast = ( rawEnum . Type . IsNullable ( ) )
68+ ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
69+ : rawEnum . Type . GetEnumUnderlyingType ( ) ;
70+
71+ return base . VisitBinary ( Expression . MakeBinary (
72+ b . NodeType ,
73+ Expression . Convert ( rawEnum , typeToCast ) ,
74+ Expression . Convert ( b . Left , typeToCast ) ) ) ;
75+ }
7476 }
7577
7678 // Detect f!=null and f==null for entity fields
@@ -81,13 +83,19 @@ protected override Expression VisitBinary(BinaryExpression b)
8183 var left = Visit ( b . Left ) ;
8284 var right = Visit ( b . Right ) ;
8385
84- FieldInfo field ;
85- if ( entityAccessMap . TryGetValue ( left , out field ) && IsNull ( right ) )
86+ if ( entityAccessMap . TryGetValue ( left , out var field ) && IsNull ( right ) )
8687 return BuildEntityCheck ( field , b . NodeType ) ;
8788 if ( entityAccessMap . TryGetValue ( right , out field ) && IsNull ( left ) )
8889 return BuildEntityCheck ( field , b . NodeType ) ;
8990
9091 return base . VisitBinary ( b ) ;
92+
93+ static bool EnumRewritableOperations ( BinaryExpression b )
94+ {
95+ return b . NodeType . In ( ExpressionType . Equal , ExpressionType . NotEqual ,
96+ ExpressionType . GreaterThan , ExpressionType . GreaterThanOrEqual ,
97+ ExpressionType . LessThan , ExpressionType . LessThanOrEqual ) ;
98+ }
9199 }
92100
93101 protected override Expression VisitMemberAccess ( MemberExpression originalMemberAccess )
0 commit comments