@@ -24,8 +24,8 @@ protected override Expression VisitBinary(BinaryExpression binaryExpression)
2424    { 
2525        var  visitedExpression  =  base . VisitBinary ( binaryExpression ) ; 
2626
27-         return  TryOptimizeQueryableNullCheck ( visitedExpression ) 
28-             ??  TryOptimizeConditionalEquality ( visitedExpression ) 
27+         return  TryOptimizeConditionalEquality ( visitedExpression ) 
28+             ??  TryOptimizeQueryableNullCheck ( visitedExpression ) 
2929            ??  visitedExpression ; 
3030    } 
3131
@@ -77,34 +77,6 @@ protected override Expression VisitConditional(ConditionalExpression conditional
7777        return  base . VisitConditional ( conditionalExpression ) ; 
7878    } 
7979
80-     private  static   Expression ?  TryOptimizeQueryableNullCheck ( Expression  expression ) 
81-     { 
82-         // Optimize IQueryable/DbSet null checks 
83-         // IQueryable != null => true 
84-         // IQueryable == null => false 
85-         if  ( expression  is  BinaryExpression 
86-             { 
87-                 NodeType :  ExpressionType . Equal  or ExpressionType . NotEqual 
88-             }  binaryExpression ) 
89-         { 
90-             var  isLeftNull  =  IsNullConstant ( binaryExpression . Left ) ; 
91-             var  isRightNull  =  IsNullConstant ( binaryExpression . Right ) ; 
92- 
93-             if  ( isLeftNull  !=  isRightNull ) 
94-             { 
95-                 var  nonNullExpression  =  isLeftNull  ?  binaryExpression . Right  :  binaryExpression . Left ; 
96- 
97-                 if  ( IsQueryableType ( nonNullExpression . Type ) ) 
98-                 { 
99-                     var  result  =  binaryExpression . NodeType  ==  ExpressionType . NotEqual ; 
100-                     return  Expression . Constant ( result ,  typeof ( bool ) ) ; 
101-                 } 
102-             } 
103-         } 
104- 
105-         return  null ; 
106-     } 
107- 
10880    private  static   Expression ?  TryOptimizeConditionalEquality ( Expression  expression ) 
10981    { 
11082        // Simplify (a ? b : null) == null => !a || b == null 
@@ -145,6 +117,34 @@ protected override Expression VisitConditional(ConditionalExpression conditional
145117        return  null ; 
146118    } 
147119
120+     private  static   Expression ?  TryOptimizeQueryableNullCheck ( Expression  expression ) 
121+     { 
122+         // Optimize IQueryable/DbSet null checks: 
123+         // * IQueryable != null => true 
124+         // * IQueryable == null => false 
125+         if  ( expression  is  BinaryExpression 
126+             { 
127+                 NodeType :  ExpressionType . Equal  or ExpressionType . NotEqual 
128+             }  binaryExpression ) 
129+         { 
130+             var  isLeftNull  =  IsNullConstant ( binaryExpression . Left ) ; 
131+             var  isRightNull  =  IsNullConstant ( binaryExpression . Right ) ; 
132+ 
133+             if  ( isLeftNull  !=  isRightNull ) 
134+             { 
135+                 var  nonNullExpression  =  isLeftNull  ?  binaryExpression . Right  :  binaryExpression . Left ; 
136+ 
137+                 if  ( nonNullExpression . Type . IsAssignableTo ( typeof ( IQueryable ) ) ) 
138+                 { 
139+                     var  result  =  binaryExpression . NodeType  ==  ExpressionType . NotEqual ; 
140+                     return  Expression . Constant ( result ) ; 
141+                 } 
142+             } 
143+         } 
144+ 
145+         return  null ; 
146+     } 
147+ 
148148    private  sealed  class  NullSafeAccessVerifyingExpressionVisitor  :  ExpressionVisitor 
149149    { 
150150        private  readonly  ISet < Expression >  _nullSafeAccesses  =  new  HashSet < Expression > ( ExpressionEqualityComparer . Instance ) ; 
@@ -191,17 +191,4 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression)
191191
192192    private  static   bool  IsNullConstant ( Expression  expression ) 
193193        =>  expression  is  ConstantExpression  {  Value :  null  } ; 
194- 
195-     private  static   bool  IsQueryableType ( Type  type ) 
196-     { 
197-         if  ( type . IsGenericType ) 
198-         { 
199-             var  genericTypeDefinition  =  type . GetGenericTypeDefinition ( ) ; 
200-             return  genericTypeDefinition  ==  typeof ( IQueryable < > ) 
201-                 ||  genericTypeDefinition  ==  typeof ( IOrderedQueryable < > ) 
202-                 ||  genericTypeDefinition  ==  typeof ( DbSet < > ) ; 
203-         } 
204- 
205-         return  type  ==  typeof ( IQueryable ) ; 
206-     } 
207194} 
0 commit comments