diff --git a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs index 1f5cb874be2..c4d182cb886 100644 --- a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs +++ b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs @@ -830,6 +830,8 @@ ParameterizedCollectionMode is ParameterizedCollectionMode.Constants || (ParameterizedCollectionMode is ParameterizedCollectionMode.MultipleParameters && valuesParameter.ShouldBeConstantized); + var useParameter = ParameterizedCollectionMode is ParameterizedCollectionMode.Parameter + && !valuesParameter.ShouldBeConstantized; var expandedParameters = _collectionParameterExpansionMap.GetOrAddNew(valuesParameter); var expandedParametersCounter = 0; for (var i = 0; i < values.Count; i++) @@ -840,9 +842,11 @@ ParameterizedCollectionMode is ParameterizedCollectionMode.Constants continue; } - switch (useParameters, useConstants) + switch (useParameters, useConstants, useParameter) { - case (true, false): + case (true, false, false): + // see #36311 for more info + case (false, false, true): { // Create parameter for value if we didn't create it yet, // otherwise reuse it. @@ -860,7 +864,7 @@ ParameterizedCollectionMode is ParameterizedCollectionMode.Constants break; } - case (false, true): + case (false, true, false): { processedValues.Add(_sqlExpressionFactory.Constant(values[i], values[i]?.GetType() ?? typeof(object), sensitive: true, elementTypeMapping)); @@ -869,7 +873,7 @@ ParameterizedCollectionMode is ParameterizedCollectionMode.Constants default: throw new UnreachableException(); - }; + } } } else diff --git a/test/EFCore.Relational.Specification.Tests/Query/AdHocMiscellaneousQueryRelationalTestBase.cs b/test/EFCore.Relational.Specification.Tests/Query/AdHocMiscellaneousQueryRelationalTestBase.cs index 365953882cd..2496b692e1d 100644 --- a/test/EFCore.Relational.Specification.Tests/Query/AdHocMiscellaneousQueryRelationalTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/Query/AdHocMiscellaneousQueryRelationalTestBase.cs @@ -316,6 +316,45 @@ public class TestEntity public static readonly IEnumerable InlinedRedactingData = [[true, true], [true, false], [false, true], [false, false]]; #endregion + + #region 36311 + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public async Task Entity_equality_with_Contains_and_Parameter(bool async) + { + var contextFactory = await InitializeAsync( + onConfiguring: o => SetParameterizedCollectionMode(o, ParameterizedCollectionMode.Parameter)); + using var context = contextFactory.CreateContext(); + + List details = [new Context36311.BlogDetails { Id = 1 }, new Context36311.BlogDetails { Id = 2 }]; + var query = context.Blogs.Where(b => details.Contains(b.Details)); + + var result = async + ? await query.ToListAsync() + : query.ToList(); + } + + protected class Context36311(DbContextOptions options) : DbContext(options) + { + public DbSet Blogs { get; set; } + + public class Blog + { + public int Id { get; set; } + public string Name { get; set; } + + public BlogDetails Details { get; set; } + } + + public class BlogDetails + { + public int Id { get; set; } + public string Name { get; set; } + } + } + + #endregion } }