@@ -207,29 +207,33 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
207207 right = Visit ( binaryExpression . Right ) ;
208208 }
209209 }
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 ( 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 ;
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 ( 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 ;
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 ) ) ;
210+ else if ( EnumRewritableOperations ( binaryExpression ) ) {
211+ // Following two checks for enums are here to improve result query
212+ // 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 ( )
221+ ? bareLeftType . GetEnumUnderlyingType ( ) . ToNullable ( )
222+ : bareLeft . Type . GetEnumUnderlyingType ( ) ;
223+ left = Visit ( Expression . Convert ( bareLeft , typeToCast ) ) ;
224+ right = Visit ( Expression . Convert ( binaryExpression . Right , typeToCast ) ) ;
225+ }
226+ else if ( bareRightType . IsEnum && bareLeft . NodeType == ExpressionType . Constant ) {
227+ var typeToCast = ( bareRight . Type . IsNullable ( ) )
228+ ? bareRightType . GetEnumUnderlyingType ( ) . ToNullable ( )
229+ : bareRight . Type . GetEnumUnderlyingType ( ) ;
230+ left = Visit ( Expression . Convert ( bareRight , typeToCast ) ) ;
231+ right = Visit ( Expression . Convert ( binaryExpression . Left , typeToCast ) ) ;
232+ }
233+ else {
234+ left = Visit ( binaryExpression . Left ) ;
235+ right = Visit ( binaryExpression . Right ) ;
236+ }
233237 }
234238 else {
235239 left = Visit ( binaryExpression . Left ) ;
0 commit comments