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.
EntityFrameworkCore.Jet/test/EFCore.Jet.FunctionalTests/Query/Ef6GroupByJetTest.cs

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;
}
}