diff --git a/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs b/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs index 672095dab..277c50991 100644 --- a/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs +++ b/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Net; using System.Runtime.CompilerServices; using System.Text; @@ -450,7 +451,8 @@ when patternParameter.Name.StartsWith(QueryCompilationContext.QueryParameterPref QueryCompilationContext.QueryContextParameter); var escapedPatternParameter = - _queryCompilationContext.RegisterRuntimeParameter(patternParameter.Name + "_rewritten", lambda); + _queryCompilationContext.RegisterRuntimeParameter( + $"{patternParameter.Name}_{methodType.ToString().ToLower(CultureInfo.InvariantCulture)}", lambda); translation = _sqlExpressionFactory.Like( translatedInstance, diff --git a/test/EFCore.PG.FunctionalTests/Query/CitextQueryTest.cs b/test/EFCore.PG.FunctionalTests/Query/CitextQueryTest.cs index 646ee13c7..088c43ec9 100644 --- a/test/EFCore.PG.FunctionalTests/Query/CitextQueryTest.cs +++ b/test/EFCore.PG.FunctionalTests/Query/CitextQueryTest.cs @@ -44,11 +44,11 @@ public void StartsWith_param_pattern() Assert.Equal(1, result.Id); AssertSql( """ -@__param_0_rewritten='some%' +@__param_0_startswith='some%' SELECT s."Id", s."CaseInsensitiveText" FROM "SomeEntities" AS s -WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\' +WHERE s."CaseInsensitiveText" LIKE @__param_0_startswith ESCAPE '\' LIMIT 2 """); } @@ -98,11 +98,11 @@ public void EndsWith_param_pattern() Assert.Equal(1, result.Id); AssertSql( """ -@__param_0_rewritten='%sometext' +@__param_0_endswith='%sometext' SELECT s."Id", s."CaseInsensitiveText" FROM "SomeEntities" AS s -WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\' +WHERE s."CaseInsensitiveText" LIKE @__param_0_endswith ESCAPE '\' LIMIT 2 """); } @@ -152,11 +152,11 @@ public void Contains_param_pattern() Assert.Equal(1, result.Id); AssertSql( """ -@__param_0_rewritten='%ometex%' +@__param_0_contains='%ometex%' SELECT s."Id", s."CaseInsensitiveText" FROM "SomeEntities" AS s -WHERE s."CaseInsensitiveText" LIKE @__param_0_rewritten ESCAPE '\' +WHERE s."CaseInsensitiveText" LIKE @__param_0_contains ESCAPE '\' LIMIT 2 """); } diff --git a/test/EFCore.PG.FunctionalTests/Query/FunkyDataQueryNpgsqlTest.cs b/test/EFCore.PG.FunctionalTests/Query/FunkyDataQueryNpgsqlTest.cs index 8c843a02d..32d7971dc 100644 --- a/test/EFCore.PG.FunctionalTests/Query/FunkyDataQueryNpgsqlTest.cs +++ b/test/EFCore.PG.FunctionalTests/Query/FunkyDataQueryNpgsqlTest.cs @@ -35,6 +35,33 @@ await AssertQuery( ss => ss.Set().Where(c => c.FirstName != null && c.FirstName.StartsWith(param))); } + [ConditionalTheory] // TODO: Remove, test was introduced upstream + [MemberData(nameof(IsAsyncData))] + public virtual async Task String_Contains_and_StartsWith_with_same_parameter(bool async) + { + var s = "B"; + + await AssertQuery( + async, + ss => ss.Set().Where( + c => c.FirstName.Contains(s) || c.LastName.StartsWith(s)), + ss => ss.Set().Where( + c => c.FirstName.MaybeScalar(f => f.Contains(s)) == true || c.LastName.MaybeScalar(l => l.StartsWith(s)) == true)); + + AssertSql( + """ +@__s_0_contains='%B%' +@__s_0_startswith='B%' + +SELECT f."Id", f."FirstName", f."LastName", f."NullableBool" +FROM "FunkyCustomers" AS f +WHERE f."FirstName" LIKE @__s_0_contains ESCAPE '\' OR f."LastName" LIKE @__s_0_startswith ESCAPE '\' +"""); + } + + private void AssertSql(params string[] expected) + => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); + public class FunkyDataQueryNpgsqlFixture : FunkyDataQueryFixtureBase { private FunkyDataData _expectedData;