From 632630cec47700066c38f4a62fcd110ecbe8bd40 Mon Sep 17 00:00:00 2001 From: pumpkin-bit Date: Mon, 20 Apr 2026 16:42:43 +0500 Subject: [PATCH] fix #34001: NULL handling in search condition CASE/WHEN fixes #34001 bug issue --- .../Query/Internal/SearchConditionConverter.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/EFCore.SqlServer/Query/Internal/SearchConditionConverter.cs b/src/EFCore.SqlServer/Query/Internal/SearchConditionConverter.cs index e904023e69f..720aa927eeb 100644 --- a/src/EFCore.SqlServer/Query/Internal/SearchConditionConverter.cs +++ b/src/EFCore.SqlServer/Query/Internal/SearchConditionConverter.cs @@ -76,15 +76,17 @@ private SqlExpression ApplyConversion(SqlExpression sqlExpression, bool inSearch : sqlExpressionFactory.Equal(sqlExpression, sqlExpressionFactory.Constant(true)), // A search condition expression in non-search condition context - wrap in CASE/WHEN to convert to bit: - // e.g. SELECT a LIKE b => SELECT CASE WHEN a LIKE b THEN 1 ELSE 0 END - // TODO: NULL is not handled properly here, see #34001 + // e.g. SELECT a LIKE b => SELECT CASE WHEN a LIKE b THEN 1 WHEN NOT (a LIKE b) THEN 0 ELSE NULL END (false, true) => sqlExpressionFactory.Case( [ new CaseWhenClause( SimplifyNegatedBinary(sqlExpression), - sqlExpressionFactory.ApplyDefaultTypeMapping(sqlExpressionFactory.Constant(true))) + sqlExpressionFactory.ApplyDefaultTypeMapping(sqlExpressionFactory.Constant(true))), + new CaseWhenClause( + SimplifyNegatedBinary(sqlExpressionFactory.Not(sqlExpression)), + sqlExpressionFactory.ApplyDefaultTypeMapping(sqlExpressionFactory.Constant(false))) ], - sqlExpressionFactory.Constant(false)), + sqlExpressionFactory.Constant(null, sqlExpression.Type, sqlExpression.TypeMapping)), // All other cases (e.g. WHERE a LIKE b, SELECT b.SomebitColumn) - no need to do anything. _ => sqlExpression