From bd279b6bc63e21ee92de427675f4e6be0dd4fc38 Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 21 Jul 2024 01:26:49 +0800 Subject: [PATCH] Fix IndexOf --- .../Internal/JetStringMethodTranslator.cs | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs index 709e6ec..6ae8313 100644 --- a/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs +++ b/src/EFCore.Jet/Query/ExpressionTranslators/Internal/JetStringMethodTranslator.cs @@ -308,29 +308,31 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal argumentsPropagateNullability, method.ReturnType); - charIndexExpression = _sqlExpressionFactory.Subtract(charIndexExpression, _sqlExpressionFactory.Constant(1)); - // If the pattern is an empty string, we need to special case to always return 0 (since CHARINDEX return 0, which we'd subtract to // -1). Handle separately for constant and non-constant patterns. - if (searchExpression is SqlConstantExpression { Value: string constantSearchPattern }) + if (searchExpression is SqlConstantExpression { Value: "" }) { - return constantSearchPattern == string.Empty - ? _sqlExpressionFactory.Constant(0, typeof(int)) - : charIndexExpression; + return _sqlExpressionFactory.Case( + [new(_sqlExpressionFactory.IsNotNull(instance), _sqlExpressionFactory.Constant(0))], + elseResult: null + ); } - return _sqlExpressionFactory.Case( - new[] - { - new CaseWhenClause( - _sqlExpressionFactory.Equal( - searchExpression, - _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), - _sqlExpressionFactory.Constant(0)) - }, - charIndexExpression); - } + SqlExpression offsetExpression = searchExpression is SqlConstantExpression + ? _sqlExpressionFactory.Constant(1) + : _sqlExpressionFactory.Case( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.Equal( + searchExpression, + _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), + _sqlExpressionFactory.Constant(0)) + }, + _sqlExpressionFactory.Constant(1)); + return _sqlExpressionFactory.Subtract(charIndexExpression, offsetExpression); + } } } \ No newline at end of file