@@ -209,19 +209,21 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
209209 }
210210 // Following two checks for enums are here to improve result query
211211 // performance because they let not to cast columns to integer.
212- else if ( binaryExpression . Left . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
213- && binaryExpression . Right . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
214- var rawEnum = binaryExpression . Left . StripCasts ( ) ;
212+ else if ( EnumRewritableOperations ( binaryExpression )
213+ && binaryExpression . Left . StripCasts ( ) is var rawLeft1 && rawLeft1 . Type . StripNullable ( ) . IsEnum
214+ && binaryExpression . Right . StripCasts ( ) is var rawRight1 && rawRight1 . NodeType == ExpressionType . Constant ) {
215+ var rawEnum = rawLeft1 ;
215216
216217 var typeToCast = ( rawEnum . Type . IsNullable ( ) )
217218 ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
218219 : rawEnum . Type . GetEnumUnderlyingType ( ) ;
219220 left = Visit ( Expression . Convert ( rawEnum , typeToCast ) ) ;
220221 right = Visit ( Expression . Convert ( binaryExpression . Right , typeToCast ) ) ;
221222 }
222- else if ( binaryExpression . Right . StripCasts ( ) . Type . StripNullable ( ) . IsEnum
223- && binaryExpression . Left . StripCasts ( ) . NodeType == ExpressionType . Constant ) {
224- var rawEnum = binaryExpression . Right . StripCasts ( ) ;
223+ else if ( EnumRewritableOperations ( binaryExpression )
224+ && binaryExpression . Right . StripCasts ( ) is var rawRight2 && rawRight2 . Type . StripNullable ( ) . IsEnum
225+ && binaryExpression . Left . StripCasts ( ) is var rawLeft2 && rawLeft2 . NodeType == ExpressionType . Constant ) {
226+ var rawEnum = rawRight2 ;
225227
226228 var typeToCast = ( rawEnum . Type . IsNullable ( ) )
227229 ? rawEnum . Type . StripNullable ( ) . GetEnumUnderlyingType ( ) . ToNullable ( )
@@ -253,6 +255,13 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
253255 }
254256
255257 return resultBinaryExpression ;
258+
259+ static bool EnumRewritableOperations ( BinaryExpression b )
260+ {
261+ return b . NodeType . In ( ExpressionType . Equal , ExpressionType . NotEqual ,
262+ ExpressionType . GreaterThan , ExpressionType . GreaterThanOrEqual ,
263+ ExpressionType . LessThan , ExpressionType . LessThanOrEqual ) ;
264+ }
256265 }
257266
258267 protected override Expression VisitConditional ( ConditionalExpression c )
0 commit comments