diff --git a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs index 190d56525b8..7d828280c86 100644 --- a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs +++ b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs @@ -131,23 +131,18 @@ protected override Expression VisitExtension(Expression node) case ParameterTranslationMode.MultipleParameters: { var expandedParameters = _collectionParameterExpansionMap.GetOrAddNew(valuesParameter); - for (var i = 0; i < values.Count; i++) + var expandedParametersCounter = 0; + foreach (var value in values) { // Create parameter for value if we didn't create it yet, // otherwise reuse it. - if (expandedParameters.Count <= i) - { - var parameterName = Uniquifier.Uniquify(valuesParameter.Name, queryParameters, int.MaxValue); - queryParameters.Add(parameterName, values[i]); - var parameterExpression = new SqlParameterExpression(parameterName, values[i]?.GetType() ?? typeof(object), elementTypeMapping); - expandedParameters.Add(parameterExpression); - } + ExpandParameterIfNeeded(valuesParameter.Name, expandedParameters, queryParameters, expandedParametersCounter, value, elementTypeMapping); processedValues.Add( new RowValueExpression( ProcessValuesOrderingColumn( valuesExpression, - [expandedParameters[i]], + [expandedParameters[expandedParametersCounter++]], intTypeMapping, ref valuesOrderingCounter))); } @@ -814,17 +809,18 @@ InExpression ProcessInExpressionValues( processedValues = []; + var translationMode = valuesParameter.TranslationMode ?? CollectionParameterTranslationMode; var expandedParameters = _collectionParameterExpansionMap.GetOrAddNew(valuesParameter); var expandedParametersCounter = 0; - for (var i = 0; i < values.Count; i++) + foreach (var value in values) { - if (values[i] is null && removeNulls) + if (value is null && removeNulls) { hasNull = true; continue; } - switch (valuesParameter.TranslationMode ?? CollectionParameterTranslationMode) + switch (translationMode) { case ParameterTranslationMode.MultipleParameters: // see #36311 for more info @@ -832,15 +828,8 @@ InExpression ProcessInExpressionValues( { // Create parameter for value if we didn't create it yet, // otherwise reuse it. - if (expandedParameters.Count <= i) - { - var parameterName = Uniquifier.Uniquify(valuesParameter.Name, parameters, int.MaxValue); - parameters.Add(parameterName, values[i]); - var parameterExpression = new SqlParameterExpression(parameterName, values[i]?.GetType() ?? typeof(object), elementTypeMapping); - expandedParameters.Add(parameterExpression); - } + ExpandParameterIfNeeded(valuesParameter.Name, expandedParameters, parameters, expandedParametersCounter, value, elementTypeMapping); - // Use separate counter, because we may skip nulls. processedValues.Add(expandedParameters[expandedParametersCounter++]); break; @@ -848,7 +837,7 @@ InExpression ProcessInExpressionValues( case ParameterTranslationMode.Constant: { - processedValues.Add(_sqlExpressionFactory.Constant(values[i], values[i]?.GetType() ?? typeof(object), sensitive: true, elementTypeMapping)); + processedValues.Add(_sqlExpressionFactory.Constant(value, value?.GetType() ?? typeof(object), sensitive: true, elementTypeMapping)); break; } @@ -857,6 +846,38 @@ InExpression ProcessInExpressionValues( throw new UnreachableException(); } } + + // Bucketization is a process used to group parameters into "buckets" of a fixed size when generating parameterized collections. + // This helps mitigate query plan bloat by reducing the number of unique query plans generated for queries with varying numbers + // of parameters. Instead of creating a new query plan for every possible parameter count, bucketization ensures that queries + // with similar parameter counts share the same query plan. + // + // The size of each bucket is determined by the CalculateParameterBucketSize method, which dynamically calculates the bucket size + // based on the total number of parameters and the type mapping of the collection elements. For example, smaller collections may + // use smaller bucket sizes, while larger collections may use larger bucket sizes to balance performance and memory usage. + // + // If the number of parameters in the collection is not a multiple of the bucket size, padding is added to ensure the collection + // fits into the nearest bucket. This padding uses the last value in the collection to fill the remaining slots. + // + // Providers can effectively disable bucketization by overriding the CalculateParameterBucketSize method to always return 1. + // + // Example: + // Suppose a query has 12 parameters, and the bucket size is calculated as 10. The query will be padded with 8 additional + // parameters (using the last value) to fit into the next bucket size of 20. This ensures that queries with 12, 13, or 19 + // parameters all share the same query plan, reducing query plan fragmentation. + if (translationMode is ParameterTranslationMode.MultipleParameters) + { + var padFactor = CalculateParameterBucketSize(values.Count, elementTypeMapping); + var padding = (padFactor - (values.Count % padFactor)) % padFactor; + for (var i = 0; i < padding; i++) + { + // Create parameter for value if we didn't create it yet, + // otherwise reuse it. + ExpandParameterIfNeeded(valuesParameter.Name, expandedParameters, parameters, values.Count + i, values[^1], elementTypeMapping); + + processedValues.Add(expandedParameters[expandedParametersCounter++]); + } + } } else { @@ -1488,6 +1509,23 @@ protected virtual SqlExpression VisitJsonScalar( protected virtual bool PreferExistsToInWithCoalesce => false; + /// + /// Gets the bucket size into which the parameters are padded when generating a parameterized collection + /// when using multiple parameters. This helps with query plan bloat. + /// + /// Number of value parameters. + /// The type mapping for the collection element. + [EntityFrameworkInternal] + protected virtual int CalculateParameterBucketSize(int count, RelationalTypeMapping elementTypeMapping) + => count switch + { + <= 5 => 1, + <= 150 => 10, + <= 750 => 50, + <= 2000 => 100, + _ => 200, + }; + // Note that we can check parameter values for null since we cache by the parameter nullability; but we cannot do the same for bool. private bool IsNull(SqlExpression? expression) => expression is SqlConstantExpression { Value: null } @@ -2121,4 +2159,21 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera private static bool IsLogicalNot(SqlUnaryExpression? sqlUnaryExpression) => sqlUnaryExpression is { OperatorType: ExpressionType.Not } && sqlUnaryExpression.Type == typeof(bool); + + private static void ExpandParameterIfNeeded( + string valuesParameterName, + List expandedParameters, + Dictionary parameters, + int index, + object? value, + RelationalTypeMapping typeMapping) + { + if (expandedParameters.Count <= index) + { + var parameterName = Uniquifier.Uniquify(valuesParameterName, parameters, int.MaxValue); + parameters.Add(parameterName, value); + var parameterExpression = new SqlParameterExpression(parameterName, value?.GetType() ?? typeof(object), typeMapping); + expandedParameters.Add(parameterExpression); + } + } } diff --git a/src/EFCore.SqlServer/Query/Internal/SqlServerSqlNullabilityProcessor.cs b/src/EFCore.SqlServer/Query/Internal/SqlServerSqlNullabilityProcessor.cs index 3215b65578e..921429a1dbc 100644 --- a/src/EFCore.SqlServer/Query/Internal/SqlServerSqlNullabilityProcessor.cs +++ b/src/EFCore.SqlServer/Query/Internal/SqlServerSqlNullabilityProcessor.cs @@ -16,6 +16,8 @@ namespace Microsoft.EntityFrameworkCore.SqlServer.Query.Internal; /// public class SqlServerSqlNullabilityProcessor : SqlNullabilityProcessor { + private const int MaxParameterCount = 2100; + /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in @@ -280,6 +282,19 @@ protected override SqlExpression VisitIn(InExpression inExpression, bool allowOp } } + /// + protected override int CalculateParameterBucketSize(int count, RelationalTypeMapping elementTypeMapping) + => count switch + { + <= 5 => 1, + <= 150 => 10, + <= 750 => 50, + <= 2000 => 100, + <= 2070 => 10, // try not to over-pad as we approach that limit + <= MaxParameterCount => 0, // just don't pad between 2070 and 2100, to minimize the crazy + _ => 200, + }; + private bool TryHandleOverLimitParameters( SqlParameterExpression valuesParameter, RelationalTypeMapping typeMapping, @@ -294,7 +309,7 @@ private bool TryHandleOverLimitParameters( // SQL Server has limit on number of parameters in a query. // If we're over that limit, we switch to using single parameter // and processing it through JSON functions. - if (values.Count > 2098) + if (values.Count > MaxParameterCount) { if (_sqlServerSingletonOptions.SupportsJsonFunctions) { diff --git a/test/EFCore.Relational.Specification.Tests/Query/NonSharedPrimitiveCollectionsQueryRelationalTestBase.cs b/test/EFCore.Relational.Specification.Tests/Query/NonSharedPrimitiveCollectionsQueryRelationalTestBase.cs index e5132067c77..e1ed5a7b858 100644 --- a/test/EFCore.Relational.Specification.Tests/Query/NonSharedPrimitiveCollectionsQueryRelationalTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/Query/NonSharedPrimitiveCollectionsQueryRelationalTestBase.cs @@ -215,6 +215,27 @@ public virtual async Task Parameter_collection_Contains_with_default_mode_EF_Mul Assert.Equivalent(new[] { 2 }, result); } + [ConditionalFact] + public virtual async Task Parameter_collection_Contains_parameter_bucketization() + { + var contextFactory = await InitializeAsync( + onConfiguring: b => SetParameterizedCollectionMode(b, ParameterTranslationMode.MultipleParameters), + seed: context => + { + context.AddRange( + new TestEntity { Id = 1 }, + new TestEntity { Id = 2 }, + new TestEntity { Id = 100 }); + return context.SaveChangesAsync(); + }); + + await using var context = contextFactory.CreateContext(); + + var ints = new[] { 2, 999, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; + var result = await context.Set().Where(c => ints.Contains(c.Id)).Select(c => c.Id).ToListAsync(); + Assert.Equivalent(new[] { 2 }, result); + } + protected class TestOwner { public int Id { get; set; } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs index d017fa4209d..e5d2742eccd 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs @@ -730,120 +730,219 @@ public async Task Where_contains_DateTime_literals(bool async) @dateTimes9='1978-09-03T12:00:10.9990000' (DbType = DateTime) @dateTimes10='1979-09-03T12:00:10.1110000' (DbType = DateTime) @dateTimes11='1980-09-03T12:00:10.2220000' (DbType = DateTime) -@dateTimes12='1970-09-03T12:00:00.0000000' (DbType = DateTime) -@dateTimes13='1971-09-03T12:00:10.2200000' (DbType = DateTime) -@dateTimes14='1972-09-03T12:00:10.3330000' (DbType = DateTime) -@dateTimes15='1973-09-03T12:00:10.0000000' (DbType = DateTime) -@dateTimes16='1974-09-03T12:00:10.5000000' (DbType = DateTime) -@dateTimes17='1975-09-03T12:00:10.6600000' (DbType = DateTime) -@dateTimes18='1976-09-03T12:00:10.7770000' (DbType = DateTime) -@dateTimes19='1977-09-03T12:00:10.8880000' (DbType = DateTime) -@dateTimes20='1978-09-03T12:00:10.9990000' (DbType = DateTime) -@dateTimes21='1979-09-03T12:00:10.1110000' (DbType = DateTime) -@dateTimes22='1980-09-03T12:00:10.2220000' (DbType = DateTime) -@dateTimes23='1970-09-03T12:00:00.0000000' -@dateTimes24='1971-09-03T12:00:10.2200000' -@dateTimes25='1972-09-03T12:00:10.3330000' -@dateTimes26='1973-09-03T12:00:10.0000000' -@dateTimes27='1974-09-03T12:00:10.5000000' -@dateTimes28='1975-09-03T12:00:10.6600000' -@dateTimes29='1976-09-03T12:00:10.7770000' -@dateTimes30='1977-09-03T12:00:10.8880000' -@dateTimes31='1978-09-03T12:00:10.9990000' -@dateTimes32='1979-09-03T12:00:10.1110000' -@dateTimes33='1980-09-03T12:00:10.2220000' -@dateTimes34='1970-09-03T12:00:00.0000000' -@dateTimes35='1971-09-03T12:00:10.2200000' -@dateTimes36='1972-09-03T12:00:10.3330000' -@dateTimes37='1973-09-03T12:00:10.0000000' -@dateTimes38='1974-09-03T12:00:10.5000000' -@dateTimes39='1975-09-03T12:00:10.6600000' -@dateTimes40='1976-09-03T12:00:10.7770000' -@dateTimes41='1977-09-03T12:00:10.8880000' -@dateTimes42='1978-09-03T12:00:10.9990000' -@dateTimes43='1979-09-03T12:00:10.1110000' -@dateTimes44='1980-09-03T12:00:10.2220000' -@dateTimes45='1970-09-03T12:00:00.0000000' (Scale = 1) -@dateTimes46='1971-09-03T12:00:10.2200000' (Scale = 1) -@dateTimes47='1972-09-03T12:00:10.3330000' (Scale = 1) -@dateTimes48='1973-09-03T12:00:10.0000000' (Scale = 1) -@dateTimes49='1974-09-03T12:00:10.5000000' (Scale = 1) -@dateTimes50='1975-09-03T12:00:10.6600000' (Scale = 1) -@dateTimes51='1976-09-03T12:00:10.7770000' (Scale = 1) -@dateTimes52='1977-09-03T12:00:10.8880000' (Scale = 1) -@dateTimes53='1978-09-03T12:00:10.9990000' (Scale = 1) -@dateTimes54='1979-09-03T12:00:10.1110000' (Scale = 1) -@dateTimes55='1980-09-03T12:00:10.2220000' (Scale = 1) -@dateTimes56='1970-09-03T12:00:00.0000000' (Scale = 2) -@dateTimes57='1971-09-03T12:00:10.2200000' (Scale = 2) -@dateTimes58='1972-09-03T12:00:10.3330000' (Scale = 2) -@dateTimes59='1973-09-03T12:00:10.0000000' (Scale = 2) -@dateTimes60='1974-09-03T12:00:10.5000000' (Scale = 2) -@dateTimes61='1975-09-03T12:00:10.6600000' (Scale = 2) -@dateTimes62='1976-09-03T12:00:10.7770000' (Scale = 2) -@dateTimes63='1977-09-03T12:00:10.8880000' (Scale = 2) -@dateTimes64='1978-09-03T12:00:10.9990000' (Scale = 2) -@dateTimes65='1979-09-03T12:00:10.1110000' (Scale = 2) -@dateTimes66='1980-09-03T12:00:10.2220000' (Scale = 2) -@dateTimes67='1970-09-03T12:00:00.0000000' (Scale = 3) -@dateTimes68='1971-09-03T12:00:10.2200000' (Scale = 3) -@dateTimes69='1972-09-03T12:00:10.3330000' (Scale = 3) -@dateTimes70='1973-09-03T12:00:10.0000000' (Scale = 3) -@dateTimes71='1974-09-03T12:00:10.5000000' (Scale = 3) -@dateTimes72='1975-09-03T12:00:10.6600000' (Scale = 3) -@dateTimes73='1976-09-03T12:00:10.7770000' (Scale = 3) -@dateTimes74='1977-09-03T12:00:10.8880000' (Scale = 3) -@dateTimes75='1978-09-03T12:00:10.9990000' (Scale = 3) -@dateTimes76='1979-09-03T12:00:10.1110000' (Scale = 3) -@dateTimes77='1980-09-03T12:00:10.2220000' (Scale = 3) -@dateTimes78='1970-09-03T12:00:00.0000000' (Scale = 4) -@dateTimes79='1971-09-03T12:00:10.2200000' (Scale = 4) -@dateTimes80='1972-09-03T12:00:10.3330000' (Scale = 4) -@dateTimes81='1973-09-03T12:00:10.0000000' (Scale = 4) -@dateTimes82='1974-09-03T12:00:10.5000000' (Scale = 4) -@dateTimes83='1975-09-03T12:00:10.6600000' (Scale = 4) -@dateTimes84='1976-09-03T12:00:10.7770000' (Scale = 4) -@dateTimes85='1977-09-03T12:00:10.8880000' (Scale = 4) -@dateTimes86='1978-09-03T12:00:10.9990000' (Scale = 4) -@dateTimes87='1979-09-03T12:00:10.1110000' (Scale = 4) -@dateTimes88='1980-09-03T12:00:10.2220000' (Scale = 4) -@dateTimes89='1970-09-03T12:00:00.0000000' (Scale = 5) -@dateTimes90='1971-09-03T12:00:10.2200000' (Scale = 5) -@dateTimes91='1972-09-03T12:00:10.3330000' (Scale = 5) -@dateTimes92='1973-09-03T12:00:10.0000000' (Scale = 5) -@dateTimes93='1974-09-03T12:00:10.5000000' (Scale = 5) -@dateTimes94='1975-09-03T12:00:10.6600000' (Scale = 5) -@dateTimes95='1976-09-03T12:00:10.7770000' (Scale = 5) -@dateTimes96='1977-09-03T12:00:10.8880000' (Scale = 5) -@dateTimes97='1978-09-03T12:00:10.9990000' (Scale = 5) -@dateTimes98='1979-09-03T12:00:10.1110000' (Scale = 5) -@dateTimes99='1980-09-03T12:00:10.2220000' (Scale = 5) -@dateTimes100='1970-09-03T12:00:00.0000000' (Scale = 6) -@dateTimes101='1971-09-03T12:00:10.2200000' (Scale = 6) -@dateTimes102='1972-09-03T12:00:10.3330000' (Scale = 6) -@dateTimes103='1973-09-03T12:00:10.0000000' (Scale = 6) -@dateTimes104='1974-09-03T12:00:10.5000000' (Scale = 6) -@dateTimes105='1975-09-03T12:00:10.6600000' (Scale = 6) -@dateTimes106='1976-09-03T12:00:10.7770000' (Scale = 6) -@dateTimes107='1977-09-03T12:00:10.8880000' (Scale = 6) -@dateTimes108='1978-09-03T12:00:10.9990000' (Scale = 6) -@dateTimes109='1979-09-03T12:00:10.1110000' (Scale = 6) -@dateTimes110='1980-09-03T12:00:10.2220000' (Scale = 6) -@dateTimes111='1970-09-03T12:00:00.0000000' (Scale = 7) -@dateTimes112='1971-09-03T12:00:10.2200000' (Scale = 7) -@dateTimes113='1972-09-03T12:00:10.3330000' (Scale = 7) -@dateTimes114='1973-09-03T12:00:10.0000000' (Scale = 7) -@dateTimes115='1974-09-03T12:00:10.5000000' (Scale = 7) -@dateTimes116='1975-09-03T12:00:10.6600000' (Scale = 7) -@dateTimes117='1976-09-03T12:00:10.7770000' (Scale = 7) -@dateTimes118='1977-09-03T12:00:10.8880000' (Scale = 7) -@dateTimes119='1978-09-03T12:00:10.9990000' (Scale = 7) -@dateTimes120='1979-09-03T12:00:10.1110000' (Scale = 7) -@dateTimes121='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes12='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes13='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes14='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes15='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes16='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes17='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes18='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes19='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes20='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes21='1970-09-03T12:00:00.0000000' (DbType = DateTime) +@dateTimes22='1971-09-03T12:00:10.2200000' (DbType = DateTime) +@dateTimes23='1972-09-03T12:00:10.3330000' (DbType = DateTime) +@dateTimes24='1973-09-03T12:00:10.0000000' (DbType = DateTime) +@dateTimes25='1974-09-03T12:00:10.5000000' (DbType = DateTime) +@dateTimes26='1975-09-03T12:00:10.6600000' (DbType = DateTime) +@dateTimes27='1976-09-03T12:00:10.7770000' (DbType = DateTime) +@dateTimes28='1977-09-03T12:00:10.8880000' (DbType = DateTime) +@dateTimes29='1978-09-03T12:00:10.9990000' (DbType = DateTime) +@dateTimes30='1979-09-03T12:00:10.1110000' (DbType = DateTime) +@dateTimes31='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes32='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes33='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes34='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes35='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes36='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes37='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes38='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes39='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes40='1980-09-03T12:00:10.2220000' (DbType = DateTime) +@dateTimes41='1970-09-03T12:00:00.0000000' +@dateTimes42='1971-09-03T12:00:10.2200000' +@dateTimes43='1972-09-03T12:00:10.3330000' +@dateTimes44='1973-09-03T12:00:10.0000000' +@dateTimes45='1974-09-03T12:00:10.5000000' +@dateTimes46='1975-09-03T12:00:10.6600000' +@dateTimes47='1976-09-03T12:00:10.7770000' +@dateTimes48='1977-09-03T12:00:10.8880000' +@dateTimes49='1978-09-03T12:00:10.9990000' +@dateTimes50='1979-09-03T12:00:10.1110000' +@dateTimes51='1980-09-03T12:00:10.2220000' +@dateTimes52='1980-09-03T12:00:10.2220000' +@dateTimes53='1980-09-03T12:00:10.2220000' +@dateTimes54='1980-09-03T12:00:10.2220000' +@dateTimes55='1980-09-03T12:00:10.2220000' +@dateTimes56='1980-09-03T12:00:10.2220000' +@dateTimes57='1980-09-03T12:00:10.2220000' +@dateTimes58='1980-09-03T12:00:10.2220000' +@dateTimes59='1980-09-03T12:00:10.2220000' +@dateTimes60='1980-09-03T12:00:10.2220000' +@dateTimes61='1970-09-03T12:00:00.0000000' +@dateTimes62='1971-09-03T12:00:10.2200000' +@dateTimes63='1972-09-03T12:00:10.3330000' +@dateTimes64='1973-09-03T12:00:10.0000000' +@dateTimes65='1974-09-03T12:00:10.5000000' +@dateTimes66='1975-09-03T12:00:10.6600000' +@dateTimes67='1976-09-03T12:00:10.7770000' +@dateTimes68='1977-09-03T12:00:10.8880000' +@dateTimes69='1978-09-03T12:00:10.9990000' +@dateTimes70='1979-09-03T12:00:10.1110000' +@dateTimes71='1980-09-03T12:00:10.2220000' +@dateTimes72='1980-09-03T12:00:10.2220000' +@dateTimes73='1980-09-03T12:00:10.2220000' +@dateTimes74='1980-09-03T12:00:10.2220000' +@dateTimes75='1980-09-03T12:00:10.2220000' +@dateTimes76='1980-09-03T12:00:10.2220000' +@dateTimes77='1980-09-03T12:00:10.2220000' +@dateTimes78='1980-09-03T12:00:10.2220000' +@dateTimes79='1980-09-03T12:00:10.2220000' +@dateTimes80='1980-09-03T12:00:10.2220000' +@dateTimes81='1970-09-03T12:00:00.0000000' (Scale = 1) +@dateTimes82='1971-09-03T12:00:10.2200000' (Scale = 1) +@dateTimes83='1972-09-03T12:00:10.3330000' (Scale = 1) +@dateTimes84='1973-09-03T12:00:10.0000000' (Scale = 1) +@dateTimes85='1974-09-03T12:00:10.5000000' (Scale = 1) +@dateTimes86='1975-09-03T12:00:10.6600000' (Scale = 1) +@dateTimes87='1976-09-03T12:00:10.7770000' (Scale = 1) +@dateTimes88='1977-09-03T12:00:10.8880000' (Scale = 1) +@dateTimes89='1978-09-03T12:00:10.9990000' (Scale = 1) +@dateTimes90='1979-09-03T12:00:10.1110000' (Scale = 1) +@dateTimes91='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes92='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes93='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes94='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes95='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes96='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes97='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes98='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes99='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes100='1980-09-03T12:00:10.2220000' (Scale = 1) +@dateTimes101='1970-09-03T12:00:00.0000000' (Scale = 2) +@dateTimes102='1971-09-03T12:00:10.2200000' (Scale = 2) +@dateTimes103='1972-09-03T12:00:10.3330000' (Scale = 2) +@dateTimes104='1973-09-03T12:00:10.0000000' (Scale = 2) +@dateTimes105='1974-09-03T12:00:10.5000000' (Scale = 2) +@dateTimes106='1975-09-03T12:00:10.6600000' (Scale = 2) +@dateTimes107='1976-09-03T12:00:10.7770000' (Scale = 2) +@dateTimes108='1977-09-03T12:00:10.8880000' (Scale = 2) +@dateTimes109='1978-09-03T12:00:10.9990000' (Scale = 2) +@dateTimes110='1979-09-03T12:00:10.1110000' (Scale = 2) +@dateTimes111='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes112='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes113='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes114='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes115='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes116='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes117='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes118='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes119='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes120='1980-09-03T12:00:10.2220000' (Scale = 2) +@dateTimes121='1970-09-03T12:00:00.0000000' (Scale = 3) +@dateTimes122='1971-09-03T12:00:10.2200000' (Scale = 3) +@dateTimes123='1972-09-03T12:00:10.3330000' (Scale = 3) +@dateTimes124='1973-09-03T12:00:10.0000000' (Scale = 3) +@dateTimes125='1974-09-03T12:00:10.5000000' (Scale = 3) +@dateTimes126='1975-09-03T12:00:10.6600000' (Scale = 3) +@dateTimes127='1976-09-03T12:00:10.7770000' (Scale = 3) +@dateTimes128='1977-09-03T12:00:10.8880000' (Scale = 3) +@dateTimes129='1978-09-03T12:00:10.9990000' (Scale = 3) +@dateTimes130='1979-09-03T12:00:10.1110000' (Scale = 3) +@dateTimes131='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes132='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes133='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes134='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes135='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes136='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes137='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes138='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes139='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes140='1980-09-03T12:00:10.2220000' (Scale = 3) +@dateTimes141='1970-09-03T12:00:00.0000000' (Scale = 4) +@dateTimes142='1971-09-03T12:00:10.2200000' (Scale = 4) +@dateTimes143='1972-09-03T12:00:10.3330000' (Scale = 4) +@dateTimes144='1973-09-03T12:00:10.0000000' (Scale = 4) +@dateTimes145='1974-09-03T12:00:10.5000000' (Scale = 4) +@dateTimes146='1975-09-03T12:00:10.6600000' (Scale = 4) +@dateTimes147='1976-09-03T12:00:10.7770000' (Scale = 4) +@dateTimes148='1977-09-03T12:00:10.8880000' (Scale = 4) +@dateTimes149='1978-09-03T12:00:10.9990000' (Scale = 4) +@dateTimes150='1979-09-03T12:00:10.1110000' (Scale = 4) +@dateTimes151='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes152='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes153='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes154='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes155='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes156='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes157='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes158='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes159='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes160='1980-09-03T12:00:10.2220000' (Scale = 4) +@dateTimes161='1970-09-03T12:00:00.0000000' (Scale = 5) +@dateTimes162='1971-09-03T12:00:10.2200000' (Scale = 5) +@dateTimes163='1972-09-03T12:00:10.3330000' (Scale = 5) +@dateTimes164='1973-09-03T12:00:10.0000000' (Scale = 5) +@dateTimes165='1974-09-03T12:00:10.5000000' (Scale = 5) +@dateTimes166='1975-09-03T12:00:10.6600000' (Scale = 5) +@dateTimes167='1976-09-03T12:00:10.7770000' (Scale = 5) +@dateTimes168='1977-09-03T12:00:10.8880000' (Scale = 5) +@dateTimes169='1978-09-03T12:00:10.9990000' (Scale = 5) +@dateTimes170='1979-09-03T12:00:10.1110000' (Scale = 5) +@dateTimes171='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes172='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes173='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes174='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes175='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes176='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes177='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes178='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes179='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes180='1980-09-03T12:00:10.2220000' (Scale = 5) +@dateTimes181='1970-09-03T12:00:00.0000000' (Scale = 6) +@dateTimes182='1971-09-03T12:00:10.2200000' (Scale = 6) +@dateTimes183='1972-09-03T12:00:10.3330000' (Scale = 6) +@dateTimes184='1973-09-03T12:00:10.0000000' (Scale = 6) +@dateTimes185='1974-09-03T12:00:10.5000000' (Scale = 6) +@dateTimes186='1975-09-03T12:00:10.6600000' (Scale = 6) +@dateTimes187='1976-09-03T12:00:10.7770000' (Scale = 6) +@dateTimes188='1977-09-03T12:00:10.8880000' (Scale = 6) +@dateTimes189='1978-09-03T12:00:10.9990000' (Scale = 6) +@dateTimes190='1979-09-03T12:00:10.1110000' (Scale = 6) +@dateTimes191='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes192='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes193='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes194='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes195='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes196='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes197='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes198='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes199='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes200='1980-09-03T12:00:10.2220000' (Scale = 6) +@dateTimes201='1970-09-03T12:00:00.0000000' (Scale = 7) +@dateTimes202='1971-09-03T12:00:10.2200000' (Scale = 7) +@dateTimes203='1972-09-03T12:00:10.3330000' (Scale = 7) +@dateTimes204='1973-09-03T12:00:10.0000000' (Scale = 7) +@dateTimes205='1974-09-03T12:00:10.5000000' (Scale = 7) +@dateTimes206='1975-09-03T12:00:10.6600000' (Scale = 7) +@dateTimes207='1976-09-03T12:00:10.7770000' (Scale = 7) +@dateTimes208='1977-09-03T12:00:10.8880000' (Scale = 7) +@dateTimes209='1978-09-03T12:00:10.9990000' (Scale = 7) +@dateTimes210='1979-09-03T12:00:10.1110000' (Scale = 7) +@dateTimes211='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes212='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes213='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes214='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes215='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes216='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes217='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes218='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes219='1980-09-03T12:00:10.2220000' (Scale = 7) +@dateTimes220='1980-09-03T12:00:10.2220000' (Scale = 7) SELECT [d].[Id], [d].[DateTime], [d].[DateTime2], [d].[DateTime2_0], [d].[DateTime2_1], [d].[DateTime2_2], [d].[DateTime2_3], [d].[DateTime2_4], [d].[DateTime2_5], [d].[DateTime2_6], [d].[DateTime2_7], [d].[SmallDateTime] FROM [Dates] AS [d] -WHERE [d].[SmallDateTime] IN (@dateTimes1, @dateTimes2, @dateTimes3, @dateTimes4, @dateTimes5, @dateTimes6, @dateTimes7, @dateTimes8, @dateTimes9, @dateTimes10, @dateTimes11) AND [d].[DateTime] IN (@dateTimes12, @dateTimes13, @dateTimes14, @dateTimes15, @dateTimes16, @dateTimes17, @dateTimes18, @dateTimes19, @dateTimes20, @dateTimes21, @dateTimes22) AND [d].[DateTime2] IN (@dateTimes23, @dateTimes24, @dateTimes25, @dateTimes26, @dateTimes27, @dateTimes28, @dateTimes29, @dateTimes30, @dateTimes31, @dateTimes32, @dateTimes33) AND [d].[DateTime2_0] IN (@dateTimes34, @dateTimes35, @dateTimes36, @dateTimes37, @dateTimes38, @dateTimes39, @dateTimes40, @dateTimes41, @dateTimes42, @dateTimes43, @dateTimes44) AND [d].[DateTime2_1] IN (@dateTimes45, @dateTimes46, @dateTimes47, @dateTimes48, @dateTimes49, @dateTimes50, @dateTimes51, @dateTimes52, @dateTimes53, @dateTimes54, @dateTimes55) AND [d].[DateTime2_2] IN (@dateTimes56, @dateTimes57, @dateTimes58, @dateTimes59, @dateTimes60, @dateTimes61, @dateTimes62, @dateTimes63, @dateTimes64, @dateTimes65, @dateTimes66) AND [d].[DateTime2_3] IN (@dateTimes67, @dateTimes68, @dateTimes69, @dateTimes70, @dateTimes71, @dateTimes72, @dateTimes73, @dateTimes74, @dateTimes75, @dateTimes76, @dateTimes77) AND [d].[DateTime2_4] IN (@dateTimes78, @dateTimes79, @dateTimes80, @dateTimes81, @dateTimes82, @dateTimes83, @dateTimes84, @dateTimes85, @dateTimes86, @dateTimes87, @dateTimes88) AND [d].[DateTime2_5] IN (@dateTimes89, @dateTimes90, @dateTimes91, @dateTimes92, @dateTimes93, @dateTimes94, @dateTimes95, @dateTimes96, @dateTimes97, @dateTimes98, @dateTimes99) AND [d].[DateTime2_6] IN (@dateTimes100, @dateTimes101, @dateTimes102, @dateTimes103, @dateTimes104, @dateTimes105, @dateTimes106, @dateTimes107, @dateTimes108, @dateTimes109, @dateTimes110) AND [d].[DateTime2_7] IN (@dateTimes111, @dateTimes112, @dateTimes113, @dateTimes114, @dateTimes115, @dateTimes116, @dateTimes117, @dateTimes118, @dateTimes119, @dateTimes120, @dateTimes121) +WHERE [d].[SmallDateTime] IN (@dateTimes1, @dateTimes2, @dateTimes3, @dateTimes4, @dateTimes5, @dateTimes6, @dateTimes7, @dateTimes8, @dateTimes9, @dateTimes10, @dateTimes11, @dateTimes12, @dateTimes13, @dateTimes14, @dateTimes15, @dateTimes16, @dateTimes17, @dateTimes18, @dateTimes19, @dateTimes20) AND [d].[DateTime] IN (@dateTimes21, @dateTimes22, @dateTimes23, @dateTimes24, @dateTimes25, @dateTimes26, @dateTimes27, @dateTimes28, @dateTimes29, @dateTimes30, @dateTimes31, @dateTimes32, @dateTimes33, @dateTimes34, @dateTimes35, @dateTimes36, @dateTimes37, @dateTimes38, @dateTimes39, @dateTimes40) AND [d].[DateTime2] IN (@dateTimes41, @dateTimes42, @dateTimes43, @dateTimes44, @dateTimes45, @dateTimes46, @dateTimes47, @dateTimes48, @dateTimes49, @dateTimes50, @dateTimes51, @dateTimes52, @dateTimes53, @dateTimes54, @dateTimes55, @dateTimes56, @dateTimes57, @dateTimes58, @dateTimes59, @dateTimes60) AND [d].[DateTime2_0] IN (@dateTimes61, @dateTimes62, @dateTimes63, @dateTimes64, @dateTimes65, @dateTimes66, @dateTimes67, @dateTimes68, @dateTimes69, @dateTimes70, @dateTimes71, @dateTimes72, @dateTimes73, @dateTimes74, @dateTimes75, @dateTimes76, @dateTimes77, @dateTimes78, @dateTimes79, @dateTimes80) AND [d].[DateTime2_1] IN (@dateTimes81, @dateTimes82, @dateTimes83, @dateTimes84, @dateTimes85, @dateTimes86, @dateTimes87, @dateTimes88, @dateTimes89, @dateTimes90, @dateTimes91, @dateTimes92, @dateTimes93, @dateTimes94, @dateTimes95, @dateTimes96, @dateTimes97, @dateTimes98, @dateTimes99, @dateTimes100) AND [d].[DateTime2_2] IN (@dateTimes101, @dateTimes102, @dateTimes103, @dateTimes104, @dateTimes105, @dateTimes106, @dateTimes107, @dateTimes108, @dateTimes109, @dateTimes110, @dateTimes111, @dateTimes112, @dateTimes113, @dateTimes114, @dateTimes115, @dateTimes116, @dateTimes117, @dateTimes118, @dateTimes119, @dateTimes120) AND [d].[DateTime2_3] IN (@dateTimes121, @dateTimes122, @dateTimes123, @dateTimes124, @dateTimes125, @dateTimes126, @dateTimes127, @dateTimes128, @dateTimes129, @dateTimes130, @dateTimes131, @dateTimes132, @dateTimes133, @dateTimes134, @dateTimes135, @dateTimes136, @dateTimes137, @dateTimes138, @dateTimes139, @dateTimes140) AND [d].[DateTime2_4] IN (@dateTimes141, @dateTimes142, @dateTimes143, @dateTimes144, @dateTimes145, @dateTimes146, @dateTimes147, @dateTimes148, @dateTimes149, @dateTimes150, @dateTimes151, @dateTimes152, @dateTimes153, @dateTimes154, @dateTimes155, @dateTimes156, @dateTimes157, @dateTimes158, @dateTimes159, @dateTimes160) AND [d].[DateTime2_5] IN (@dateTimes161, @dateTimes162, @dateTimes163, @dateTimes164, @dateTimes165, @dateTimes166, @dateTimes167, @dateTimes168, @dateTimes169, @dateTimes170, @dateTimes171, @dateTimes172, @dateTimes173, @dateTimes174, @dateTimes175, @dateTimes176, @dateTimes177, @dateTimes178, @dateTimes179, @dateTimes180) AND [d].[DateTime2_6] IN (@dateTimes181, @dateTimes182, @dateTimes183, @dateTimes184, @dateTimes185, @dateTimes186, @dateTimes187, @dateTimes188, @dateTimes189, @dateTimes190, @dateTimes191, @dateTimes192, @dateTimes193, @dateTimes194, @dateTimes195, @dateTimes196, @dateTimes197, @dateTimes198, @dateTimes199, @dateTimes200) AND [d].[DateTime2_7] IN (@dateTimes201, @dateTimes202, @dateTimes203, @dateTimes204, @dateTimes205, @dateTimes206, @dateTimes207, @dateTimes208, @dateTimes209, @dateTimes210, @dateTimes211, @dateTimes212, @dateTimes213, @dateTimes214, @dateTimes215, @dateTimes216, @dateTimes217, @dateTimes218, @dateTimes219, @dateTimes220) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs index 5046a266b59..5dd4ae31322 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs @@ -214,11 +214,15 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -239,12 +243,16 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM [Gears] AS [g] INNER JOIN [Cities] AS [c] ON [g].[CityOfBirthName] = [c].[Name] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -265,11 +273,15 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqlServerTest.cs index b7b86e420bc..865b66dabb5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqlServerTest.cs @@ -989,6 +989,39 @@ WHERE [t].[Id] IN (@ints1, @ints2) """); } + public override async Task Parameter_collection_Contains_parameter_bucketization() + { + await base.Parameter_collection_Contains_parameter_bucketization(); + + AssertSql( + """ +@ints1='2' +@ints2='999' +@ints3='2' +@ints4='2' +@ints5='2' +@ints6='2' +@ints7='2' +@ints8='2' +@ints9='2' +@ints10='2' +@ints11='2' +@ints12='2' +@ints13='2' +@ints14='2' +@ints15='2' +@ints16='2' +@ints17='2' +@ints18='2' +@ints19='2' +@ints20='2' + +SELECT [t].[Id] +FROM [TestEntity] AS [t] +WHERE [t].[Id] IN (@ints1, @ints2, @ints3, @ints4, @ints5, @ints6, @ints7, @ints8, @ints9, @ints10, @ints11, @ints12, @ints13, @ints14, @ints15, @ints16, @ints17, @ints18, @ints19, @ints20) +"""); + } + [ConditionalFact] public virtual async Task Same_parameter_with_different_type_mappings() { diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs index 67eb04a3756..67062156459 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs @@ -6078,11 +6078,15 @@ FROM [Customers] AS [c] @orderIds4='10835' @orderIds5='10952' @orderIds6='11011' +@orderIds7='11011' +@orderIds8='11011' +@orderIds9='11011' +@orderIds10='11011' SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c] ON [o].[CustomerID] = [c].[CustomerID] -WHERE [o].[OrderID] IN (@orderIds1, @orderIds2, @orderIds3, @orderIds4, @orderIds5, @orderIds6) +WHERE [o].[OrderID] IN (@orderIds1, @orderIds2, @orderIds3, @orderIds4, @orderIds5, @orderIds6, @orderIds7, @orderIds8, @orderIds9, @orderIds10) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs index 944b04970b8..fd188f8f064 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs @@ -779,6 +779,10 @@ public override async Task Collection_select_nav_prop_first_or_default_then_nav_ @orderIds4='10835' @orderIds5='10952' @orderIds6='11011' +@orderIds7='11011' +@orderIds8='11011' +@orderIds9='11011' +@orderIds10='11011' SELECT [s0].[CustomerID], [s0].[Address], [s0].[City], [s0].[CompanyName], [s0].[ContactName], [s0].[ContactTitle], [s0].[Country], [s0].[Fax], [s0].[Phone], [s0].[PostalCode], [s0].[Region] FROM [Customers] AS [c] @@ -788,7 +792,7 @@ LEFT JOIN ( SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], [o].[CustomerID] AS [CustomerID0], ROW_NUMBER() OVER(PARTITION BY [o].[CustomerID] ORDER BY [o].[OrderID], [c0].[CustomerID]) AS [row] FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c0] ON [o].[CustomerID] = [c0].[CustomerID] - WHERE [o].[OrderID] IN (@orderIds1, @orderIds2, @orderIds3, @orderIds4, @orderIds5, @orderIds6) + WHERE [o].[OrderID] IN (@orderIds1, @orderIds2, @orderIds3, @orderIds4, @orderIds5, @orderIds6, @orderIds7, @orderIds8, @orderIds9, @orderIds10) ) AS [s] WHERE [s].[row] <= 1 ) AS [s0] ON [c].[CustomerID] = [s0].[CustomerID0] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindWhereQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindWhereQuerySqlServerTest.cs index bb81e7cd85e..bd0137646c4 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindWhereQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindWhereQuerySqlServerTest.cs @@ -1470,11 +1470,15 @@ ORDER BY [c0].[CustomerID] @entity_equality_customer_Orders_OrderID4='10835' @entity_equality_customer_Orders_OrderID5='10952' @entity_equality_customer_Orders_OrderID6='11011' +@entity_equality_customer_Orders_OrderID7='11011' +@entity_equality_customer_Orders_OrderID8='11011' +@entity_equality_customer_Orders_OrderID9='11011' +@entity_equality_customer_Orders_OrderID10='11011' SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] -WHERE [o0].[OrderID] IN (@entity_equality_customer_Orders_OrderID1, @entity_equality_customer_Orders_OrderID2, @entity_equality_customer_Orders_OrderID3, @entity_equality_customer_Orders_OrderID4, @entity_equality_customer_Orders_OrderID5, @entity_equality_customer_Orders_OrderID6) +WHERE [o0].[OrderID] IN (@entity_equality_customer_Orders_OrderID1, @entity_equality_customer_Orders_OrderID2, @entity_equality_customer_Orders_OrderID3, @entity_equality_customer_Orders_OrderID4, @entity_equality_customer_Orders_OrderID5, @entity_equality_customer_Orders_OrderID6, @entity_equality_customer_Orders_OrderID7, @entity_equality_customer_Orders_OrderID8, @entity_equality_customer_Orders_OrderID9, @entity_equality_customer_Orders_OrderID10) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs index c5ffaa7b94b..f1c31a3f0a0 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs @@ -319,6 +319,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [u].[Nickname], [u].[SquadId], [u].[AssignedCityName], [u].[CityOfBirthName], [u].[FullName], [u].[HasSoulPatch], [u].[LeaderNickname], [u].[LeaderSquadId], [u].[Rank], [u].[Discriminator], [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM ( @@ -329,7 +333,7 @@ UNION ALL FROM [Officers] AS [o] ) AS [u] LEFT JOIN [Tags] AS [t] ON [u].[Nickname] = [t].[GearNickName] AND [u].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -350,6 +354,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [u].[Nickname], [u].[SquadId], [u].[AssignedCityName], [u].[CityOfBirthName], [u].[FullName], [u].[HasSoulPatch], [u].[LeaderNickname], [u].[LeaderSquadId], [u].[Rank], [u].[Discriminator], [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM ( @@ -361,7 +369,7 @@ FROM [Officers] AS [o] ) AS [u] INNER JOIN [Cities] AS [c] ON [u].[CityOfBirthName] = [c].[Name] LEFT JOIN [Tags] AS [t] ON [u].[Nickname] = [t].[GearNickName] AND [u].[SquadId] = [t].[GearSquadId] -WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -382,6 +390,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [u].[Nickname], [u].[SquadId], [u].[AssignedCityName], [u].[CityOfBirthName], [u].[FullName], [u].[HasSoulPatch], [u].[LeaderNickname], [u].[LeaderSquadId], [u].[Rank], [u].[Discriminator] FROM ( @@ -392,7 +404,7 @@ UNION ALL FROM [Officers] AS [o] ) AS [u] LEFT JOIN [Tags] AS [t] ON [u].[Nickname] = [t].[GearNickName] AND [u].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs index f245453c24b..0bb1721925f 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs @@ -303,6 +303,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], CASE WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' @@ -310,7 +314,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -331,6 +335,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], CASE WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' @@ -339,7 +347,7 @@ FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] INNER JOIN [Cities] AS [c] ON [g].[CityOfBirthName] = [c].[Name] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [c].[Location] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -360,6 +368,10 @@ FROM [Tags] AS [t] @tags4='70534e05-782c-4052-8720-c2c54481ce5f' @tags5='a7be028a-0cf2-448f-ab55-ce8bc5d8cf69' @tags6='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags7='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags8='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags9='b39a6fba-9026-4d69-828e-fd7068673e57' +@tags10='b39a6fba-9026-4d69-828e-fd7068673e57' SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], CASE WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' @@ -367,7 +379,7 @@ END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE [t].[Id] IS NOT NULL AND [t].[Id] IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs index 03521e1be02..728045eb5c2 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs @@ -406,12 +406,16 @@ public override async Task Include_where_list_contains_navigation2(bool async) @tags4='a8ad98f9-e023-4e2a-9a70-c2728455bd34' @tags5='b39a6fba-9026-4d69-828e-fd7068673e57' @tags6='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags7='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags8='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags9='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags10='df36f493-463f-4123-83f9-6b135deeb7ba' SELECT "g"."Nickname", "g"."SquadId", "g"."AssignedCityName", "g"."CityOfBirthName", "g"."Discriminator", "g"."FullName", "g"."HasSoulPatch", "g"."LeaderNickname", "g"."LeaderSquadId", "g"."Rank", "t"."Id", "t"."GearNickName", "t"."GearSquadId", "t"."IssueDate", "t"."Note" FROM "Gears" AS "g" INNER JOIN "Cities" AS "c" ON "g"."CityOfBirthName" = "c"."Name" LEFT JOIN "Tags" AS "t" ON "g"."Nickname" = "t"."GearNickName" AND "g"."SquadId" = "t"."GearSquadId" -WHERE "c"."Location" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE "c"."Location" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -3124,11 +3128,15 @@ public override async Task Navigation_accessed_twice_outside_and_inside_subquery @tags4='a8ad98f9-e023-4e2a-9a70-c2728455bd34' @tags5='b39a6fba-9026-4d69-828e-fd7068673e57' @tags6='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags7='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags8='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags9='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags10='df36f493-463f-4123-83f9-6b135deeb7ba' SELECT "g"."Nickname", "g"."SquadId", "g"."AssignedCityName", "g"."CityOfBirthName", "g"."Discriminator", "g"."FullName", "g"."HasSoulPatch", "g"."LeaderNickname", "g"."LeaderSquadId", "g"."Rank" FROM "Gears" AS "g" LEFT JOIN "Tags" AS "t" ON "g"."Nickname" = "t"."GearNickName" AND "g"."SquadId" = "t"."GearSquadId" -WHERE "t"."Id" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE "t"."Id" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } @@ -4197,11 +4205,15 @@ public override async Task Include_where_list_contains_navigation(bool async) @tags4='a8ad98f9-e023-4e2a-9a70-c2728455bd34' @tags5='b39a6fba-9026-4d69-828e-fd7068673e57' @tags6='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags7='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags8='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags9='df36f493-463f-4123-83f9-6b135deeb7ba' +@tags10='df36f493-463f-4123-83f9-6b135deeb7ba' SELECT "g"."Nickname", "g"."SquadId", "g"."AssignedCityName", "g"."CityOfBirthName", "g"."Discriminator", "g"."FullName", "g"."HasSoulPatch", "g"."LeaderNickname", "g"."LeaderSquadId", "g"."Rank", "t"."Id", "t"."GearNickName", "t"."GearSquadId", "t"."IssueDate", "t"."Note" FROM "Gears" AS "g" LEFT JOIN "Tags" AS "t" ON "g"."Nickname" = "t"."GearNickName" AND "g"."SquadId" = "t"."GearSquadId" -WHERE "t"."Id" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6) +WHERE "t"."Id" IS NOT NULL AND "t"."Id" IN (@tags1, @tags2, @tags3, @tags4, @tags5, @tags6, @tags7, @tags8, @tags9, @tags10) """); } diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqliteTest.cs index 2f0eca42149..2ec5a9e8044 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/NonSharedPrimitiveCollectionsQuerySqliteTest.cs @@ -533,6 +533,39 @@ public override async Task Parameter_collection_Contains_with_default_mode_EF_Mu """); } + public override async Task Parameter_collection_Contains_parameter_bucketization() + { + await base.Parameter_collection_Contains_parameter_bucketization(); + + AssertSql( + """ +@ints1='2' +@ints2='999' +@ints3='2' +@ints4='2' +@ints5='2' +@ints6='2' +@ints7='2' +@ints8='2' +@ints9='2' +@ints10='2' +@ints11='2' +@ints12='2' +@ints13='2' +@ints14='2' +@ints15='2' +@ints16='2' +@ints17='2' +@ints18='2' +@ints19='2' +@ints20='2' + +SELECT "t"."Id" +FROM "TestEntity" AS "t" +WHERE "t"."Id" IN (@ints1, @ints2, @ints3, @ints4, @ints5, @ints6, @ints7, @ints8, @ints9, @ints10, @ints11, @ints12, @ints13, @ints14, @ints15, @ints16, @ints17, @ints18, @ints19, @ints20) +"""); + } + protected override ITestStoreFactory TestStoreFactory => SqliteTestStoreFactory.Instance; }