@@ -1358,8 +1358,14 @@ or ExpressionType.LessThan
1358
1358
}
1359
1359
1360
1360
return result is SqlBinaryExpression sqlBinaryResult
1361
- && sqlBinaryExpression . OperatorType is ExpressionType . AndAlso or ExpressionType . OrElse
1362
- ? SimplifyLogicalSqlBinaryExpression ( sqlBinaryResult )
1361
+ && sqlBinaryResult . OperatorType is ExpressionType . AndAlso or ExpressionType . OrElse
1362
+ ? _sqlExpressionFactory . MakeBinary ( // invoke MakeBinary simplifications
1363
+ sqlBinaryResult . OperatorType ,
1364
+ sqlBinaryResult . Left ,
1365
+ sqlBinaryResult . Right ,
1366
+ sqlBinaryResult . TypeMapping ,
1367
+ sqlBinaryResult
1368
+ ) !
1363
1369
: result ;
1364
1370
1365
1371
SqlExpression AddNullConcatenationProtection ( SqlExpression argument , RelationalTypeMapping typeMapping )
@@ -1796,26 +1802,16 @@ private SqlExpression RewriteNullSemantics(
1796
1802
{
1797
1803
nullable = leftNullable || rightNullable ;
1798
1804
1799
- return SimplifyLogicalSqlBinaryExpression (
1800
- _sqlExpressionFactory . OrElse (
1801
- body ,
1802
- SimplifyLogicalSqlBinaryExpression (
1803
- _sqlExpressionFactory . AndAlso ( leftIsNull , rightIsNull ) ) ) ) ;
1805
+ return _sqlExpressionFactory . OrElse ( body , _sqlExpressionFactory . AndAlso ( leftIsNull , rightIsNull ) ) ;
1804
1806
}
1805
1807
1806
1808
// doing a full null semantics rewrite - removing all nulls from truth table
1807
1809
nullable = false ;
1808
1810
1809
1811
// (a == b && (a != null && b != null)) || (a == null && b == null)
1810
- body = SimplifyLogicalSqlBinaryExpression (
1811
- _sqlExpressionFactory . OrElse (
1812
- SimplifyLogicalSqlBinaryExpression (
1813
- _sqlExpressionFactory . AndAlso (
1814
- body ,
1815
- SimplifyLogicalSqlBinaryExpression (
1816
- _sqlExpressionFactory . AndAlso ( leftIsNotNull , rightIsNotNull ) ) ) ) ,
1817
- SimplifyLogicalSqlBinaryExpression (
1818
- _sqlExpressionFactory . AndAlso ( leftIsNull , rightIsNull ) ) ) ) ;
1812
+ body = _sqlExpressionFactory . OrElse (
1813
+ _sqlExpressionFactory . AndAlso ( body , _sqlExpressionFactory . AndAlso ( leftIsNotNull , rightIsNotNull ) ) ,
1814
+ _sqlExpressionFactory . AndAlso ( leftIsNull , rightIsNull ) ) ;
1819
1815
1820
1816
if ( sqlBinaryExpression . OperatorType == ExpressionType . NotEqual )
1821
1817
{
@@ -1826,65 +1822,6 @@ private SqlExpression RewriteNullSemantics(
1826
1822
return body ;
1827
1823
}
1828
1824
1829
- private SqlExpression SimplifyLogicalSqlBinaryExpression ( SqlExpression expression )
1830
- {
1831
- if ( expression is not SqlBinaryExpression sqlBinaryExpression )
1832
- {
1833
- return expression ;
1834
- }
1835
-
1836
- if ( sqlBinaryExpression is
1837
- {
1838
- Left : SqlUnaryExpression { OperatorType : ExpressionType . Equal or ExpressionType . NotEqual } leftUnary ,
1839
- Right : SqlUnaryExpression { OperatorType : ExpressionType . Equal or ExpressionType . NotEqual } rightUnary
1840
- }
1841
- && leftUnary . Operand . Equals ( rightUnary . Operand ) )
1842
- {
1843
- // a is null || a is null -> a is null
1844
- // a is not null || a is not null -> a is not null
1845
- // a is null && a is null -> a is null
1846
- // a is not null && a is not null -> a is not null
1847
- // a is null || a is not null -> true
1848
- // a is null && a is not null -> false
1849
- return leftUnary . OperatorType == rightUnary . OperatorType
1850
- ? leftUnary
1851
- : _sqlExpressionFactory . Constant (
1852
- sqlBinaryExpression . OperatorType == ExpressionType . OrElse , sqlBinaryExpression . TypeMapping ) ;
1853
- }
1854
-
1855
- // true && a -> a
1856
- // true || a -> true
1857
- // false && a -> false
1858
- // false || a -> a
1859
- if ( sqlBinaryExpression . Left is SqlConstantExpression { Value : bool leftBoolValue } newLeftConstant )
1860
- {
1861
- return sqlBinaryExpression . OperatorType == ExpressionType . AndAlso
1862
- ? leftBoolValue
1863
- ? sqlBinaryExpression . Right
1864
- : newLeftConstant
1865
- : leftBoolValue
1866
- ? newLeftConstant
1867
- : sqlBinaryExpression . Right ;
1868
- }
1869
-
1870
- if ( sqlBinaryExpression . Right is SqlConstantExpression { Value : bool rightBoolValue } newRightConstant )
1871
- {
1872
- // a && true -> a
1873
- // a || true -> true
1874
- // a && false -> false
1875
- // a || false -> a
1876
- return sqlBinaryExpression . OperatorType == ExpressionType . AndAlso
1877
- ? rightBoolValue
1878
- ? sqlBinaryExpression . Left
1879
- : newRightConstant
1880
- : rightBoolValue
1881
- ? newRightConstant
1882
- : sqlBinaryExpression . Left ;
1883
- }
1884
-
1885
- return sqlBinaryExpression ;
1886
- }
1887
-
1888
1825
/// <summary>
1889
1826
/// Attempts to simplify a unary not operation on a non-nullable operand.
1890
1827
/// </summary>
@@ -1938,14 +1875,13 @@ protected virtual SqlExpression OptimizeNonNullableNotExpression(SqlExpression e
1938
1875
var left = OptimizeNonNullableNotExpression ( _sqlExpressionFactory . Not ( sqlBinaryOperand . Left ) ) ;
1939
1876
var right = OptimizeNonNullableNotExpression ( _sqlExpressionFactory . Not ( sqlBinaryOperand . Right ) ) ;
1940
1877
1941
- return SimplifyLogicalSqlBinaryExpression (
1942
- _sqlExpressionFactory . MakeBinary (
1943
- sqlBinaryOperand . OperatorType == ExpressionType . AndAlso
1944
- ? ExpressionType . OrElse
1945
- : ExpressionType . AndAlso ,
1946
- left ,
1947
- right ,
1948
- sqlBinaryOperand . TypeMapping ) ! ) ;
1878
+ return _sqlExpressionFactory . MakeBinary (
1879
+ sqlBinaryOperand . OperatorType == ExpressionType . AndAlso
1880
+ ? ExpressionType . OrElse
1881
+ : ExpressionType . AndAlso ,
1882
+ left ,
1883
+ right ,
1884
+ sqlBinaryOperand . TypeMapping ) ! ;
1949
1885
}
1950
1886
1951
1887
// use equality where possible
@@ -2266,14 +2202,13 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
2266
2202
sqlUnaryExpression . TypeMapping ) ! ,
2267
2203
operandNullable ) ;
2268
2204
2269
- return SimplifyLogicalSqlBinaryExpression (
2270
- _sqlExpressionFactory . MakeBinary (
2271
- sqlUnaryExpression . OperatorType == ExpressionType . Equal
2272
- ? ExpressionType . OrElse
2273
- : ExpressionType . AndAlso ,
2274
- left ,
2275
- right ,
2276
- sqlUnaryExpression . TypeMapping ) ! ) ;
2205
+ return _sqlExpressionFactory . MakeBinary (
2206
+ sqlUnaryExpression . OperatorType == ExpressionType . Equal
2207
+ ? ExpressionType . OrElse
2208
+ : ExpressionType . AndAlso ,
2209
+ left ,
2210
+ right ,
2211
+ sqlUnaryExpression . TypeMapping ) ! ;
2277
2212
}
2278
2213
2279
2214
case SqlFunctionExpression sqlFunctionExpression :
@@ -2295,14 +2230,13 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
2295
2230
sqlUnaryExpression . TypeMapping ) ! ,
2296
2231
operandNullable ) )
2297
2232
. Aggregate (
2298
- ( l , r ) => SimplifyLogicalSqlBinaryExpression (
2299
- _sqlExpressionFactory . MakeBinary (
2300
- sqlUnaryExpression . OperatorType == ExpressionType . Equal
2301
- ? ExpressionType . AndAlso
2302
- : ExpressionType . OrElse ,
2303
- l ,
2304
- r ,
2305
- sqlUnaryExpression . TypeMapping ) ! ) ) ;
2233
+ ( l , r ) => _sqlExpressionFactory . MakeBinary (
2234
+ sqlUnaryExpression . OperatorType == ExpressionType . Equal
2235
+ ? ExpressionType . AndAlso
2236
+ : ExpressionType . OrElse ,
2237
+ l ,
2238
+ r ,
2239
+ sqlUnaryExpression . TypeMapping ) ! ) ;
2306
2240
}
2307
2241
2308
2242
if ( ! sqlFunctionExpression . IsNullable )
@@ -2348,10 +2282,9 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
2348
2282
sqlUnaryExpression . TypeMapping ) ! ,
2349
2283
operandNullable ) )
2350
2284
. Aggregate (
2351
- ( r , e ) => SimplifyLogicalSqlBinaryExpression (
2352
- sqlUnaryExpression . OperatorType == ExpressionType . Equal
2353
- ? _sqlExpressionFactory . OrElse ( r , e )
2354
- : _sqlExpressionFactory . AndAlso ( r , e ) ) ) ;
2285
+ ( r , e ) => sqlUnaryExpression . OperatorType == ExpressionType . Equal
2286
+ ? _sqlExpressionFactory . OrElse ( r , e )
2287
+ : _sqlExpressionFactory . AndAlso ( r , e ) ) ;
2355
2288
2356
2289
return result ;
2357
2290
}
0 commit comments