@@ -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