You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
932 lines
28 KiB
C#
932 lines
28 KiB
C#
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities;
|
|
using Microsoft.EntityFrameworkCore.Query;
|
|
using Microsoft.EntityFrameworkCore.TestUtilities;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace EntityFrameworkCore.Jet.FunctionalTests.Query;
|
|
|
|
public class Ef6GroupByJetTest : Ef6GroupByTestBase<Ef6GroupByJetTest.Ef6GroupByJetFixture>
|
|
{
|
|
public Ef6GroupByJetTest(Ef6GroupByJetFixture fixture, ITestOutputHelper testOutputHelper)
|
|
: base(fixture)
|
|
{
|
|
Fixture.TestSqlLoggerFactory.Clear();
|
|
Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper);
|
|
}
|
|
|
|
[ConditionalFact]
|
|
public virtual void Check_all_tests_overridden()
|
|
=> TestHelpers.AssertAllMethodsOverridden(GetType());
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_group_key(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_group_key(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`FirstName`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [Distinct1].[FirstName] AS [FirstName]
|
|
// FROM ( SELECT DISTINCT
|
|
// [Extent1].[FirstName] AS [FirstName]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// ) AS [Distinct1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_group_count(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_group_count(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [GroupBy1].[A1] AS [C1]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// COUNT(1) AS [A1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// GROUP BY [Extent1].[FirstName]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_expression_containing_group_key(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_expression_containing_group_key(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id` * 2
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [Extent1].[Id] * 2 AS [C1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_aggregate_on_the_group(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_aggregate_on_the_group(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT MAX(`a`.`Id`)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [GroupBy1].[A1] AS [C1]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// MAX([Extent1].[Id]) AS [A1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// GROUP BY [Extent1].[FirstName]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_anonymous_type_containing_group_key_and_group_aggregate(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_anonymous_type_containing_group_key_and_group_aggregate(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`FirstName` AS `Key`, MAX(`a`.`Id`) AS `Aggregate`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// 1 AS [C1],
|
|
// [GroupBy1].[K1] AS [FirstName],
|
|
// [GroupBy1].[A1] AS [C2]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// MAX([Extent1].[Id]) AS [A1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// GROUP BY [Extent1].[FirstName]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_anonymous_type_containing_group_key_and_multiple_group_aggregates(
|
|
bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_anonymous_type_containing_group_key_and_multiple_group_aggregates(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`FirstName` AS `key1`, MAX(`a`.`Id`) AS `max`, MIN(`a`.`Id` + 2) AS `min`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// 1 AS [C1],
|
|
// [GroupBy1].[K1] AS [FirstName],
|
|
// [GroupBy1].[A1] AS [C2],
|
|
// [GroupBy1].[A2] AS [C3]
|
|
// FROM ( SELECT
|
|
// [Extent1].[K1] AS [K1],
|
|
// MAX([Extent1].[A1_0]) AS [A1],
|
|
// MIN([Extent1].[A2_0]) AS [A2]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// [Extent1].[Id] AS [A1_0],
|
|
// [Extent1].[Id] + 2 AS [A2_0]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// ) AS [Extent1]
|
|
// GROUP BY [K1]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_conditional_expression_containing_group_key(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_conditional_expression_containing_group_key(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@__p_0='False'
|
|
|
|
SELECT IIF(`a`.`FirstName` IS NULL, 'is null', 'not null') AS `keyIsNull`, @__p_0 AS `logicExpression`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// 1 AS [C1],
|
|
// CASE WHEN ([Distinct1].[FirstName] IS NULL) THEN N'is null' ELSE N'not null' END AS [C2],
|
|
// CASE WHEN (((@p__linq__0 = 1) AND (@p__linq__1 = 1)) OR ((@p__linq__2 = 1) AND (@p__linq__3 = 1))) THEN cast(1 as bit) WHEN ( NOT (((@p__linq__0 = 1) AND (@p__linq__1 = 1)) OR ((@p__linq__2 = 1) AND (@p__linq__3 = 1)))) THEN cast(0 as bit) END AS [C3]
|
|
// FROM ( SELECT DISTINCT
|
|
// [Extent1].[FirstName] AS [FirstName]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// ) AS [Distinct1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_filerting_and_projecting_anonymous_type_with_group_key_and_function_aggregate(
|
|
bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_filerting_and_projecting_anonymous_type_with_group_key_and_function_aggregate(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`FirstName`, AVG(CDBL(`a`.`Id`)) AS `AverageId`
|
|
FROM `ArubaOwner` AS `a`
|
|
WHERE `a`.`Id` > 5
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// 1 AS [C1],
|
|
// [GroupBy1].[K1] AS [FirstName],
|
|
// [GroupBy1].[A1] AS [C2]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// AVG( CAST( [Extent1].[Id] AS float)) AS [A1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// WHERE [Extent1].[Id] > 5
|
|
// GROUP BY [Extent1].[FirstName]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_function_aggregate_with_expression(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_function_aggregate_with_expression(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT MAX(`a`.`Id` * 2)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [GroupBy1].[A1] AS [C1]
|
|
// FROM ( SELECT
|
|
// [Extent1].[K1] AS [K1],
|
|
// MAX([Extent1].[A1_0]) AS [A1]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// [Extent1].[Id] * 2 AS [A1_0]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// ) AS [Extent1]
|
|
// GROUP BY [K1]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_projecting_expression_with_multiple_function_aggregates(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_projecting_expression_with_multiple_function_aggregates(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT MAX(`a`.`Id`) - MIN(`a`.`Id`) AS `maxMinusMin`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// 1 AS [C1],
|
|
// [GroupBy1].[A1] - [GroupBy1].[A2] AS [C2]
|
|
// FROM ( SELECT
|
|
// [Extent1].[FirstName] AS [K1],
|
|
// MAX([Extent1].[Id]) AS [A1],
|
|
// MIN([Extent1].[Id]) AS [A2]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// GROUP BY [Extent1].[FirstName]
|
|
// ) AS [GroupBy1]";
|
|
}
|
|
|
|
public override async Task GroupBy_is_optimized_when_grouping_by_row_and_projecting_column_of_the_key_row(bool async)
|
|
{
|
|
await base.GroupBy_is_optimized_when_grouping_by_row_and_projecting_column_of_the_key_row(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`FirstName`
|
|
FROM `ArubaOwner` AS `a`
|
|
WHERE `a`.`Id` < 4
|
|
GROUP BY `a`.`FirstName`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// [Distinct1].[FirstName] AS [FirstName]
|
|
// FROM ( SELECT DISTINCT
|
|
// [Extent1].[FirstName] AS [FirstName]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]
|
|
// WHERE [Extent1].[Id] < 4
|
|
// ) AS [Distinct1]";
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_doesnt_produce_a_groupby_statement(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_doesnt_produce_a_groupby_statement(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_1(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_1(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`FirstName`, `a`.`LastName`, `a`.`Alias`
|
|
""");
|
|
|
|
// EF6 SQL:
|
|
// @"SELECT
|
|
// (SELECT
|
|
// COUNT(1) AS [A1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent2]
|
|
// WHERE [Extent1].[Id] = [Extent2].[Id]) AS [C1]
|
|
// FROM [dbo].[ArubaOwners] AS [Extent1]";
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_2(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_2(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_3(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_3(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_4(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_4(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_5(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_5(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_6(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_6(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, `a`.`Alias`, COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_7(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_7(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_8(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_8(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_9(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_9(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, `a`.`Alias`, COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Grouping_by_all_columns_with_aggregate_function_works_10(bool async)
|
|
{
|
|
await base.Grouping_by_all_columns_with_aggregate_function_works_10(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `a`.`Id`, IIF(SUM(`a`.`Id`) IS NULL, 0, SUM(`a`.`Id`)) AS `Sum`, COUNT(*) AS `Count`
|
|
FROM `ArubaOwner` AS `a`
|
|
GROUP BY `a`.`Id`, `a`.`Alias`, `a`.`FirstName`, `a`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task GroupBy_Simple_1_from_LINQ_101(bool async)
|
|
{
|
|
await base.GroupBy_Simple_1_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task GroupBy_Simple_2_from_LINQ_101(bool async)
|
|
{
|
|
await base.GroupBy_Simple_2_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task GroupBy_Simple_3_from_LINQ_101(bool async)
|
|
{
|
|
await base.GroupBy_Simple_3_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task GroupBy_Nested_from_LINQ_101(bool async)
|
|
{
|
|
await base.GroupBy_Nested_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Any_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Any_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task All_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.All_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Min_Elements_from_LINQ_101(bool async)
|
|
{
|
|
await base.Min_Elements_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Max_Elements_from_LINQ_101(bool async)
|
|
{
|
|
await base.Max_Elements_from_LINQ_101(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Group_Join_from_LINQ_101(bool async)
|
|
{
|
|
await base.Group_Join_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT [c].[Id], [c].[CompanyName], [c].[Region], [t].[Id], [t].[CustomerId], [t].[OrderDate], [t].[Total], [t].[Id0]
|
|
FROM [CustomerForLinq] AS [c]
|
|
OUTER APPLY (
|
|
SELECT [o].[Id], [o].[CustomerId], [o].[OrderDate], [o].[Total], [c0].[Id] AS [Id0]
|
|
FROM [OrderForLinq] AS [o]
|
|
LEFT JOIN [CustomerForLinq] AS [c0] ON [o].[CustomerId] = [c0].[Id]
|
|
WHERE [c].[Id] = [c0].[Id]
|
|
) AS [t]
|
|
ORDER BY [c].[Id], [t].[Id]
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_3(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_3(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT (
|
|
SELECT TOP(1) [p1].[LastName]
|
|
FROM [Person] AS [p1]
|
|
WHERE [p1].[MiddleInitial] = N'Q' AND [p1].[Age] = 20 AND ([p].[LastName] = [p1].[LastName] OR (([p].[LastName] IS NULL) AND ([p1].[LastName] IS NULL))))
|
|
FROM [Person] AS [p]
|
|
WHERE [p].[MiddleInitial] = N'Q' AND [p].[Age] = 20
|
|
GROUP BY [p].[LastName]
|
|
ORDER BY CAST(LEN((
|
|
SELECT TOP(1) [p1].[LastName]
|
|
FROM [Person] AS [p1]
|
|
WHERE [p1].[MiddleInitial] = N'Q' AND [p1].[Age] = 20 AND ([p].[LastName] = [p1].[LastName] OR (([p].[LastName] IS NULL) AND ([p1].[LastName] IS NULL))))) AS int)
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_5(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_5(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `t`.`c`
|
|
FROM (
|
|
SELECT (
|
|
SELECT TOP 1 `p1`.`LastName`
|
|
FROM `Person` AS `p1`
|
|
WHERE `p`.`FirstName` = `p1`.`FirstName` OR (`p`.`FirstName` IS NULL AND `p1`.`FirstName` IS NULL)) AS `c`, `p`.`FirstName`
|
|
FROM `Person` AS `p`
|
|
GROUP BY `p`.`FirstName`
|
|
) AS `t`
|
|
ORDER BY `t`.`c`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_6(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_6(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `t`.`c`
|
|
FROM (
|
|
SELECT (
|
|
SELECT TOP 1 `p1`.`MiddleInitial`
|
|
FROM `Person` AS `p1`
|
|
WHERE `p1`.`Age` = 20 AND `p`.`Id` = `p1`.`Id`) AS `c`, `p`.`Id`
|
|
FROM `Person` AS `p`
|
|
WHERE `p`.`Age` = 20
|
|
GROUP BY `p`.`Id`
|
|
) AS `t`
|
|
ORDER BY `t`.`c`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_14(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_14(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_15(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_15(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT [t0].[Id], [t0].[Age], [t0].[FirstName], [t0].[LastName], [t0].[MiddleInitial]
|
|
FROM (
|
|
SELECT [f].[Id], [f].[Size]
|
|
FROM [Person] AS [p]
|
|
LEFT JOIN [Feet] AS [f] ON [p].[Id] = [f].[Id]
|
|
GROUP BY [f].[Id], [f].[Size]
|
|
) AS [t]
|
|
LEFT JOIN (
|
|
SELECT [t1].[Id], [t1].[Age], [t1].[FirstName], [t1].[LastName], [t1].[MiddleInitial], [t1].[Id0], [t1].[Size]
|
|
FROM (
|
|
SELECT [p0].[Id], [p0].[Age], [p0].[FirstName], [p0].[LastName], [p0].[MiddleInitial], [f0].[Id] AS [Id0], [f0].[Size], ROW_NUMBER() OVER(PARTITION BY [f0].[Id], [f0].[Size] ORDER BY [p0].[Id] DESC) AS [row]
|
|
FROM [Person] AS [p0]
|
|
LEFT JOIN [Feet] AS [f0] ON [p0].[Id] = [f0].[Id]
|
|
) AS [t1]
|
|
WHERE [t1].[row] <= 1
|
|
) AS [t0] ON ([t].[Id] = [t0].[Id0] OR (([t].[Id] IS NULL) AND ([t0].[Id0] IS NULL))) AND ([t].[Size] = [t0].[Size] OR (([t].[Size] IS NULL) AND ([t0].[Size] IS NULL)))
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_16(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_16(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Min_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Min_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, MIN(`p`.`UnitPrice`) AS `CheapestPrice`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Average_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Average_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, AVG(`p`.`UnitPrice`) AS `AveragePrice`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_8(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_8(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT `f`.`Id`, `f`.`Size`
|
|
FROM `Person` AS `p`
|
|
LEFT JOIN `Feet` AS `f` ON `p`.`Id` = `f`.`Id`
|
|
GROUP BY `f`.`Id`, `f`.`Size`
|
|
) AS `t`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_12(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_12(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `t`.`FirstName`, `t0`.`Id`, `t0`.`Age`, `t0`.`FirstName`, `t0`.`LastName`, `t0`.`MiddleInitial`, `t0`.`Id0`, `t0`.`Age0`, `t0`.`PersonId`, `t0`.`Style`
|
|
FROM (
|
|
SELECT `p`.`FirstName`
|
|
FROM `Person` AS `p`
|
|
GROUP BY `p`.`FirstName`
|
|
) AS `t`
|
|
LEFT JOIN (
|
|
SELECT `p0`.`Id`, `p0`.`Age`, `p0`.`FirstName`, `p0`.`LastName`, `p0`.`MiddleInitial`, `s`.`Id` AS `Id0`, `s`.`Age` AS `Age0`, `s`.`PersonId`, `s`.`Style`
|
|
FROM `Person` AS `p0`
|
|
LEFT JOIN `Shoes` AS `s` ON `p0`.`Id` = `s`.`PersonId`
|
|
) AS `t0` ON `t`.`FirstName` = `t0`.`FirstName`
|
|
ORDER BY `t`.`FirstName`, `t0`.`Id`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_10(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_10(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `t`.`Id`, `t`.`Age`, `t`.`Style`, `t0`.`Id`, `t0`.`Style`, `t0`.`Age`, `t0`.`Id0`
|
|
FROM (
|
|
SELECT `p`.`Id`, `s`.`Age`, `s`.`Style`
|
|
FROM `Person` AS `p`
|
|
INNER JOIN `Shoes` AS `s` ON `p`.`Age` = `s`.`Age`
|
|
GROUP BY `p`.`Id`, `s`.`Style`, `s`.`Age`
|
|
) AS `t`
|
|
LEFT JOIN (
|
|
SELECT `s0`.`Id`, `s0`.`Style`, `s0`.`Age`, `p0`.`Id` AS `Id0`
|
|
FROM `Person` AS `p0`
|
|
INNER JOIN `Shoes` AS `s0` ON `p0`.`Age` = `s0`.`Age`
|
|
) AS `t0` ON `t`.`Id` = `t0`.`Id0` AND (`t`.`Style` = `t0`.`Style` OR (`t`.`Style` IS NULL AND `t0`.`Style` IS NULL)) AND `t`.`Age` = `t0`.`Age`
|
|
ORDER BY `t`.`Id`, `t`.`Style`, `t`.`Age`, `t0`.`Id0`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_13(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_13(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `t`.`FirstName`, `t`.`MiddleInitial`, `p0`.`Id`, `p0`.`Age`, `p0`.`FirstName`, `p0`.`LastName`, `p0`.`MiddleInitial`
|
|
FROM (
|
|
SELECT `p`.`FirstName`, `p`.`MiddleInitial`
|
|
FROM `Person` AS `p`
|
|
GROUP BY `p`.`FirstName`, `p`.`MiddleInitial`
|
|
) AS `t`
|
|
LEFT JOIN `Person` AS `p0` ON (`t`.`FirstName` = `p0`.`FirstName` OR (`t`.`FirstName` IS NULL AND `p0`.`FirstName` IS NULL)) AND (`t`.`MiddleInitial` = `p0`.`MiddleInitial` OR (`t`.`MiddleInitial` IS NULL AND `p0`.`MiddleInitial` IS NULL))
|
|
ORDER BY `t`.`FirstName`, `t`.`MiddleInitial`, `p0`.`Id`
|
|
""");
|
|
}
|
|
|
|
public override async Task Cross_Join_with_Group_Join_from_LINQ_101(bool async)
|
|
{
|
|
await base.Cross_Join_with_Group_Join_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `c`.`Id`, `c`.`CompanyName`, `c`.`Region`, `t`.`Id`
|
|
FROM `CustomerForLinq` AS `c`
|
|
INNER JOIN (
|
|
SELECT `o`.`Id`, `c0`.`Id` AS `Id0`
|
|
FROM `OrderForLinq` AS `o`
|
|
LEFT JOIN `CustomerForLinq` AS `c0` ON `o`.`CustomerId` = `c0`.`Id`
|
|
) AS `t` ON `c`.`Id` = `t`.`Id0`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_2(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_2(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT [t0].[FirstName], [t0].[FullName], [t0].[c]
|
|
FROM (
|
|
SELECT TOP(1) [p].[FirstName]
|
|
FROM [Person] AS [p]
|
|
GROUP BY [p].[FirstName]
|
|
ORDER BY [p].[FirstName]
|
|
) AS [t]
|
|
LEFT JOIN (
|
|
SELECT [t1].[FirstName], [t1].[FullName], [t1].[c]
|
|
FROM (
|
|
SELECT [p0].[FirstName], (((COALESCE([p0].[FirstName], N'') + N' ') + COALESCE([p0].[MiddleInitial], N'')) + N' ') + COALESCE([p0].[LastName], N'') AS [FullName], 1 AS [c], ROW_NUMBER() OVER(PARTITION BY [p0].[FirstName] ORDER BY [p0].[Id]) AS [row]
|
|
FROM [Person] AS [p0]
|
|
) AS [t1]
|
|
WHERE [t1].[row] <= 1
|
|
) AS [t0] ON [t].[FirstName] = [t0].[FirstName]
|
|
ORDER BY [t].[FirstName]
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_1(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_1(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT [t0].[Id], [t0].[Age], [t0].[FirstName], [t0].[LastName], [t0].[MiddleInitial], [t].[FirstName], [s].[Id], [s].[Age], [s].[PersonId], [s].[Style]
|
|
FROM (
|
|
SELECT [p].[FirstName]
|
|
FROM [Person] AS [p]
|
|
GROUP BY [p].[FirstName]
|
|
) AS [t]
|
|
LEFT JOIN (
|
|
SELECT [t1].[Id], [t1].[Age], [t1].[FirstName], [t1].[LastName], [t1].[MiddleInitial]
|
|
FROM (
|
|
SELECT [p0].[Id], [p0].[Age], [p0].[FirstName], [p0].[LastName], [p0].[MiddleInitial], ROW_NUMBER() OVER(PARTITION BY [p0].[FirstName] ORDER BY [p0].[FirstName], [p0].[LastName]) AS [row]
|
|
FROM [Person] AS [p0]
|
|
) AS [t1]
|
|
WHERE [t1].[row] <= 1
|
|
) AS [t0] ON [t].[FirstName] = [t0].[FirstName]
|
|
LEFT JOIN [Shoes] AS [s] ON [t0].[Id] = [s].[PersonId]
|
|
ORDER BY [t].[FirstName], [t0].[Id]
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_7(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_7(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@__size_0='11'
|
|
@__size_0='11'
|
|
|
|
SELECT `p0`.`LastName`, `f`.`Size`, (
|
|
SELECT MIN(`f1`.`Size`)
|
|
FROM ((`Person` AS `p1`
|
|
LEFT JOIN `Feet` AS `f0` ON `p1`.`Id` = `f0`.`Id`)
|
|
LEFT JOIN `Person` AS `p2` ON `f0`.`Id` = `p2`.`Id`)
|
|
LEFT JOIN `Feet` AS `f1` ON `p1`.`Id` = `f1`.`Id`
|
|
WHERE `f0`.`Size` = @__size_0 AND `p1`.`MiddleInitial` IS NOT NULL AND (`f0`.`Id` <> 1 OR `f0`.`Id` IS NULL) AND (`f`.`Size` = `f0`.`Size` OR (`f`.`Size` IS NULL AND `f0`.`Size` IS NULL)) AND (`p0`.`LastName` = `p2`.`LastName` OR (`p0`.`LastName` IS NULL AND `p2`.`LastName` IS NULL))) AS `Min`
|
|
FROM (`Person` AS `p`
|
|
LEFT JOIN `Feet` AS `f` ON `p`.`Id` = `f`.`Id`)
|
|
LEFT JOIN `Person` AS `p0` ON `f`.`Id` = `p0`.`Id`
|
|
WHERE `f`.`Size` = @__size_0 AND `p`.`MiddleInitial` IS NOT NULL AND (`f`.`Id` <> 1 OR `f`.`Id` IS NULL)
|
|
GROUP BY `f`.`Size`, `p0`.`LastName`
|
|
""");
|
|
}
|
|
|
|
public override async Task Sum_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Sum_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, IIF(SUM(`p`.`UnitsInStock`) IS NULL, 0, SUM(`p`.`UnitsInStock`)) AS `TotalUnitsInStock`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Count_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Count_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, COUNT(*) AS `ProductCount`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_9(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_9(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`FirstName` AS `Feet`, (
|
|
SELECT IIF(SUM(`f`.`Size`) IS NULL, 0, SUM(`f`.`Size`))
|
|
FROM `Person` AS `p0`
|
|
LEFT JOIN `Feet` AS `f` ON `p0`.`Id` = `f`.`Id`
|
|
WHERE `p`.`FirstName` = `p0`.`FirstName` OR (`p`.`FirstName` IS NULL AND `p0`.`FirstName` IS NULL)) AS `Total`
|
|
FROM `Person` AS `p`
|
|
GROUP BY `p`.`FirstName`
|
|
""");
|
|
}
|
|
|
|
public override async Task LongCount_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.LongCount_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, COUNT(*) AS `ProductLongCount`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_4(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_4(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `s`.`Style` AS `Key`, (
|
|
SELECT TOP 1 `s0`.`Style`
|
|
FROM `Person` AS `p0`
|
|
INNER JOIN `Shoes` AS `s0` ON `p0`.`Age` = `s0`.`Age`
|
|
WHERE `s`.`Style` = `s0`.`Style` OR (`s`.`Style` IS NULL AND `s0`.`Style` IS NULL)) AS `Style`, COUNT(*) AS `Count`
|
|
FROM `Person` AS `p`
|
|
INNER JOIN `Shoes` AS `s` ON `p`.`Age` = `s`.`Age`
|
|
GROUP BY `s`.`Style`
|
|
""");
|
|
}
|
|
|
|
public override async Task Left_Outer_Join_with_Group_Join_from_LINQ_101(bool async)
|
|
{
|
|
await base.Left_Outer_Join_with_Group_Join_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `c`.`Id`, `c`.`CompanyName`, `c`.`Region`, `t`.`Id`, `t`.`Id0`, `o0`.`Id`, `o0`.`CustomerId`, `o0`.`OrderDate`, `o0`.`Total`, IIF(`t`.`Id` IS NULL, -1, `t`.`Id`)
|
|
FROM (`CustomerForLinq` AS `c`
|
|
LEFT JOIN (
|
|
SELECT `o`.`Id`, `c0`.`Id` AS `Id0`
|
|
FROM `OrderForLinq` AS `o`
|
|
LEFT JOIN `CustomerForLinq` AS `c0` ON `o`.`CustomerId` = `c0`.`Id`
|
|
) AS `t` ON `c`.`Id` = `t`.`Id0`)
|
|
LEFT JOIN `OrderForLinq` AS `o0` ON `c`.`Id` = `o0`.`CustomerId`
|
|
ORDER BY `c`.`Id`, `t`.`Id`, `t`.`Id0`
|
|
""");
|
|
}
|
|
|
|
public override async Task Max_Grouped_from_LINQ_101(bool async)
|
|
{
|
|
await base.Max_Grouped_from_LINQ_101(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT `p`.`Category`, MAX(`p`.`UnitPrice`) AS `MostExpensivePrice`
|
|
FROM `ProductForLinq` AS `p`
|
|
GROUP BY `p`.`Category`
|
|
""");
|
|
}
|
|
|
|
public override async Task Whats_new_2021_sample_11(bool async)
|
|
{
|
|
await base.Whats_new_2021_sample_11(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
SELECT [t].[LastName], [t].[c], [t0].[Id], [t2].[Id], [t2].[Age], [t2].[FirstName], [t2].[LastName], [t2].[MiddleInitial], [t0].[Age], [t0].[FirstName], [t0].[LastName], [t0].[MiddleInitial]
|
|
FROM (
|
|
SELECT [p].[LastName], COUNT(*) AS [c]
|
|
FROM [Person] AS [p]
|
|
GROUP BY [p].[LastName]
|
|
) AS [t]
|
|
LEFT JOIN (
|
|
SELECT [t1].[Id], [t1].[Age], [t1].[FirstName], [t1].[LastName], [t1].[MiddleInitial]
|
|
FROM (
|
|
SELECT [p0].[Id], [p0].[Age], [p0].[FirstName], [p0].[LastName], [p0].[MiddleInitial], ROW_NUMBER() OVER(PARTITION BY [p0].[LastName] ORDER BY [p0].[Id]) AS [row]
|
|
FROM [Person] AS [p0]
|
|
) AS [t1]
|
|
WHERE [t1].[row] <= 1
|
|
) AS [t0] ON [t].[LastName] = [t0].[LastName]
|
|
LEFT JOIN (
|
|
SELECT [t3].[Id], [t3].[Age], [t3].[FirstName], [t3].[LastName], [t3].[MiddleInitial]
|
|
FROM (
|
|
SELECT [p1].[Id], [p1].[Age], [p1].[FirstName], [p1].[LastName], [p1].[MiddleInitial], ROW_NUMBER() OVER(PARTITION BY [p1].[LastName] ORDER BY [p1].[Id]) AS [row]
|
|
FROM [Person] AS [p1]
|
|
) AS [t3]
|
|
WHERE [t3].[row] <= 2
|
|
) AS [t2] ON [t].[LastName] = [t2].[LastName]
|
|
ORDER BY [t].[LastName] DESC, [t0].[Id], [t2].[LastName], [t2].[Id]
|
|
""");
|
|
}
|
|
|
|
private void AssertSql(params string[] expected)
|
|
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
|
|
|
|
public class Ef6GroupByJetFixture : Ef6GroupByFixtureBase
|
|
{
|
|
public TestSqlLoggerFactory TestSqlLoggerFactory
|
|
=> (TestSqlLoggerFactory)ListLoggerFactory;
|
|
|
|
protected override ITestStoreFactory TestStoreFactory
|
|
=> JetTestStoreFactory.Instance;
|
|
}
|
|
}
|