diff --git a/test/EFCore.Relational.Specification.Tests/Query/InheritanceRelationshipsQueryRelationalTestBase.cs b/test/EFCore.Relational.Specification.Tests/Query/InheritanceRelationshipsQueryRelationalTestBase.cs new file mode 100644 index 00000000000..166379c9b9e --- /dev/null +++ b/test/EFCore.Relational.Specification.Tests/Query/InheritanceRelationshipsQueryRelationalTestBase.cs @@ -0,0 +1,228 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Linq; +using Microsoft.EntityFrameworkCore.TestModels.InheritanceRelationships; +using Xunit; + +namespace Microsoft.EntityFrameworkCore.Query +{ + public abstract class InheritanceRelationshipsQueryRelationalTestBase : InheritanceRelationshipsQueryTestBase + where TFixture : InheritanceRelationshipsQueryRelationalFixture, new() + { + public InheritanceRelationshipsQueryRelationalTestBase(TFixture fixture) + : base(fixture) + { + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.BaseCollectionOnBase); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + Assert.Equal( + 3, result.SelectMany(e => e.BaseCollectionOnBase.OfType()).Count(e => e.DerivedProperty != 0)); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_reverse_split() + { + using var context = CreateContext(); + var query = context.BaseCollectionsOnBase.Include(e => e.BaseParent); + var result = query.ToList(); + + Assert.Equal(13, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_with_filter_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.BaseCollectionOnBase).Where(e => e.Name != "Bar"); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + Assert.Equal( + 3, result.SelectMany(e => e.BaseCollectionOnBase.OfType()).Count(e => e.DerivedProperty != 0)); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_with_filter_reverse_split() + { + using var context = CreateContext(); + var query = context.BaseCollectionsOnBase.Include(e => e.BaseParent).Where(e => e.Name != "Bar"); + var result = query.ToList(); + + Assert.Equal(13, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_without_inheritance_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.CollectionOnBase); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_without_inheritance_reverse_split() + { + using var context = CreateContext(); + var query = context.CollectionsOnBase.Include(e => e.Parent); + var result = query.ToList(); + + Assert.Equal(9, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_without_inheritance_with_filter_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.CollectionOnBase).Where(e => e.Name != "Bar"); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_without_inheritance_with_filter_reverse_split() + { + using var context = CreateContext(); + var query = context.CollectionsOnBase.Include(e => e.Parent).Where(e => e.Name != "Bar"); + var result = query.ToList(); + + Assert.Equal(9, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_on_derived1_split() + { + using var context = CreateContext(); + var query = context.DerivedEntities.Include(e => e.BaseCollectionOnBase); + var result = query.ToList(); + + Assert.Equal(3, result.Count); + Assert.Equal( + 2, result.SelectMany(e => e.BaseCollectionOnBase.OfType()).Count(e => e.DerivedProperty != 0)); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_on_derived2_split() + { + using var context = CreateContext(); + var query = context.DerivedEntities.Include(e => e.BaseCollectionOnDerived); + var result = query.ToList(); + + Assert.Equal(3, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_on_derived3_split() + { + using var context = CreateContext(); + var query = context.DerivedEntities.Include(e => e.DerivedCollectionOnDerived); + var result = query.ToList(); + + Assert.Equal(3, result.Count); + } + + [ConditionalFact] + public virtual void Include_collection_with_inheritance_on_derived_reverse_split() + { + using var context = CreateContext(); + var query = context.BaseCollectionsOnDerived.Include(e => e.BaseParent); + var result = query.ToList(); + + Assert.Equal(7, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_reference_collection_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.BaseReferenceOnBase.NestedCollection); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_reference_collection_on_base_split() + { + using var context = CreateContext(); + var query = context.DerivedEntities.Include(e => e.BaseReferenceOnBase.NestedCollection); + var result = query.ToList(); + + Assert.Equal(3, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_reference_collection_reverse_split() + { + using var context = CreateContext(); + var query = context.NestedCollections.Include(e => e.ParentReference.BaseParent); + var result = query.ToList(); + + Assert.Equal(13, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_collection_reference_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.BaseCollectionOnBase).ThenInclude(e => e.NestedReference); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + Assert.Equal( + 3, result.SelectMany(e => e.BaseCollectionOnBase.OfType()).Count(e => e.DerivedProperty != 0)); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_collection_reference_reverse_split() + { + using var context = CreateContext(); + var query = context.NestedReferences.Include(e => e.ParentCollection.BaseParent); + var result = query.ToList(); + + Assert.Equal(9, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_collection_collection_split() + { + using var context = CreateContext(); + var query = context.BaseEntities.Include(e => e.BaseCollectionOnBase).ThenInclude(e => e.NestedCollection); + var result = query.ToList(); + + Assert.Equal(6, result.Count); + Assert.Equal( + 3, result.SelectMany(e => e.BaseCollectionOnBase.OfType()).Count(e => e.DerivedProperty != 0)); + } + + [ConditionalFact] + public virtual void Nested_include_with_inheritance_collection_collection_reverse_split() + { + using var context = CreateContext(); + var query = context.NestedCollections.Include(e => e.ParentCollection.BaseParent); + var result = query.ToList(); + + Assert.Equal(13, result.Count); + } + + [ConditionalFact] + public virtual void Nested_include_collection_reference_on_non_entity_base_split() + { + using var context = CreateContext(); + var query = context.ReferencedEntities.Include(e => e.Principals).ThenInclude(e => e.Reference); + var result = query.ToList(); + + Assert.Equal(2, result.Count); + } + } +} diff --git a/test/EFCore.Relational.Specification.Tests/Query/TPTRelationshipsQueryTestBase.cs b/test/EFCore.Relational.Specification.Tests/Query/TPTRelationshipsQueryTestBase.cs index 92132f56b9f..4ffe46099ec 100644 --- a/test/EFCore.Relational.Specification.Tests/Query/TPTRelationshipsQueryTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/Query/TPTRelationshipsQueryTestBase.cs @@ -1,12 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Xunit; - // ReSharper disable InconsistentNaming namespace Microsoft.EntityFrameworkCore.Query { - public abstract class TPTRelationshipsQueryTestBase : InheritanceRelationshipsQueryTestBase + public abstract class TPTRelationshipsQueryTestBase : InheritanceRelationshipsQueryRelationalTestBase where TFixture : TPTRelationshipsQueryRelationalFixture, new() { protected TPTRelationshipsQueryTestBase(TFixture fixture) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/InheritanceRelationshipsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/InheritanceRelationshipsQuerySqlServerTest.cs index 034ada3a666..6171798bb36 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/InheritanceRelationshipsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/InheritanceRelationshipsQuerySqlServerTest.cs @@ -7,7 +7,7 @@ namespace Microsoft.EntityFrameworkCore.Query { public class InheritanceRelationshipsQuerySqlServerTest - : InheritanceRelationshipsQueryTestBase + : InheritanceRelationshipsQueryRelationalTestBase { public InheritanceRelationshipsQuerySqlServerTest( InheritanceRelationshipsQuerySqlServerFixture fixture, ITestOutputHelper testOutputHelper) @@ -671,6 +671,297 @@ FROM [PrincipalEntities] AS [p] ORDER BY [r].[Id], [t].[Id], [t].[Id0]"); } + public override void Include_collection_with_inheritance_split() + { + base.Include_collection_with_inheritance_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[Id], [b2].[BaseParentId], [b2].[Discriminator], [b2].[Name], [b2].[DerivedProperty] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [BaseCollectionsOnBase] AS [b2] ON [b].[Id] = [b2].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b2].[Id]"); + } + + public override void Include_collection_with_inheritance_reverse_split() + { + base.Include_collection_with_inheritance_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[BaseParentId], [b].[Discriminator], [b].[Name], [b].[DerivedProperty], [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [BaseCollectionsOnBase] AS [b] +LEFT JOIN [BaseEntities] AS [b0] ON [b].[BaseParentId] = [b0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b0].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +ORDER BY [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Include_collection_with_inheritance_with_filter_split() + { + base.Include_collection_with_inheritance_with_filter_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[Id], [b2].[BaseParentId], [b2].[Discriminator], [b2].[Name], [b2].[DerivedProperty] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [BaseCollectionsOnBase] AS [b2] ON [b].[Id] = [b2].[BaseParentId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b2].[Id]"); + } + + public override void Include_collection_with_inheritance_with_filter_reverse_split() + { + base.Include_collection_with_inheritance_with_filter_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[BaseParentId], [b].[Discriminator], [b].[Name], [b].[DerivedProperty], [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [BaseCollectionsOnBase] AS [b] +LEFT JOIN [BaseEntities] AS [b0] ON [b].[BaseParentId] = [b0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b0].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Include_collection_without_inheritance_split() + { + base.Include_collection_without_inheritance_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [c].[Id], [c].[Name], [c].[ParentId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [CollectionsOnBase] AS [c] ON [b].[Id] = [c].[ParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [c].[Id]"); + } + + public override void Include_collection_without_inheritance_reverse_split() + { + base.Include_collection_without_inheritance_reverse_split(); + + AssertSql( + @"SELECT [c].[Id], [c].[Name], [c].[ParentId], [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name] +FROM [CollectionsOnBase] AS [c] +LEFT JOIN [BaseEntities] AS [b] ON [c].[ParentId] = [b].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [c].[Id], [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id]"); + } + + public override void Include_collection_without_inheritance_with_filter_split() + { + base.Include_collection_without_inheritance_with_filter_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [c].[Id], [c].[Name], [c].[ParentId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [CollectionsOnBase] AS [c] ON [b].[Id] = [c].[ParentId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [c].[Id]"); + } + + public override void Include_collection_without_inheritance_with_filter_reverse_split() + { + base.Include_collection_without_inheritance_with_filter_reverse_split(); + + AssertSql( + @"SELECT [c].[Id], [c].[Name], [c].[ParentId], [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name] +FROM [CollectionsOnBase] AS [c] +LEFT JOIN [BaseEntities] AS [b] ON [c].[ParentId] = [b].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +WHERE ([c].[Name] <> N'Bar') OR [c].[Name] IS NULL +ORDER BY [c].[Id], [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived1_split() + { + base.Include_collection_with_inheritance_on_derived1_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[Id], [b2].[BaseParentId], [b2].[Discriminator], [b2].[Name], [b2].[DerivedProperty] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [BaseCollectionsOnBase] AS [b2] ON [b].[Id] = [b2].[BaseParentId] +WHERE [b].[Discriminator] = N'DerivedInheritanceRelationshipEntity' +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b2].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived2_split() + { + base.Include_collection_with_inheritance_on_derived2_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[Id], [b2].[Discriminator], [b2].[Name], [b2].[ParentId], [b2].[DerivedInheritanceRelationshipEntityId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [BaseCollectionsOnDerived] AS [b2] ON [b].[Id] = [b2].[ParentId] +WHERE [b].[Discriminator] = N'DerivedInheritanceRelationshipEntity' +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b2].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived3_split() + { + base.Include_collection_with_inheritance_on_derived3_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [t].[Id], [t].[Discriminator], [t].[Name], [t].[ParentId], [t].[DerivedInheritanceRelationshipEntityId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b2].[Id], [b2].[Discriminator], [b2].[Name], [b2].[ParentId], [b2].[DerivedInheritanceRelationshipEntityId] + FROM [BaseCollectionsOnDerived] AS [b2] + WHERE [b2].[Discriminator] = N'DerivedCollectionOnDerived' +) AS [t] ON [b].[Id] = [t].[DerivedInheritanceRelationshipEntityId] +WHERE [b].[Discriminator] = N'DerivedInheritanceRelationshipEntity' +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived_reverse_split() + { + base.Include_collection_with_inheritance_on_derived_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[ParentId], [b].[DerivedInheritanceRelationshipEntityId], [t].[Id], [t].[Discriminator], [t].[Name], [t].[BaseId], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [BaseCollectionsOnDerived] AS [b] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + WHERE [b0].[Discriminator] = N'DerivedInheritanceRelationshipEntity' +) AS [t] ON [b].[ParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [t].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_split() + { + base.Nested_include_with_inheritance_reference_collection_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[Id], [b0].[BaseParentId], [b0].[Discriminator], [b0].[Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name], [n].[Id], [n].[Discriminator], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseReferencesOnBase] AS [b0] ON [b].[Id] = [b0].[BaseParentId] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [NestedCollections] AS [n] ON [b0].[Id] = [n].[ParentReferenceId] +ORDER BY [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [n].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_on_base_split() + { + base.Nested_include_with_inheritance_reference_collection_on_base_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[Id], [b0].[BaseParentId], [b0].[Discriminator], [b0].[Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name], [n].[Id], [n].[Discriminator], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseReferencesOnBase] AS [b0] ON [b].[Id] = [b0].[BaseParentId] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [NestedCollections] AS [n] ON [b0].[Id] = [n].[ParentReferenceId] +WHERE [b].[Discriminator] = N'DerivedInheritanceRelationshipEntity' +ORDER BY [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [n].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_reverse_split() + { + base.Nested_include_with_inheritance_reference_collection_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Discriminator], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], [b].[Id], [b].[BaseParentId], [b].[Discriminator], [b].[Name], [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [NestedCollections] AS [n] +LEFT JOIN [BaseReferencesOnBase] AS [b] ON [n].[ParentReferenceId] = [b].[Id] +LEFT JOIN [BaseEntities] AS [b0] ON [b].[BaseParentId] = [b0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b0].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Nested_include_with_inheritance_collection_reference_split() + { + base.Nested_include_with_inheritance_collection_reference_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [t].[Id], [t].[BaseParentId], [t].[Discriminator], [t].[Name], [t].[DerivedProperty], [t].[Id0], [t].[Discriminator0], [t].[Name0], [t].[ParentCollectionId], [t].[ParentReferenceId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b2].[Id], [b2].[BaseParentId], [b2].[Discriminator], [b2].[Name], [b2].[DerivedProperty], [n].[Id] AS [Id0], [n].[Discriminator] AS [Discriminator0], [n].[Name] AS [Name0], [n].[ParentCollectionId], [n].[ParentReferenceId] + FROM [BaseCollectionsOnBase] AS [b2] + LEFT JOIN [NestedReferences] AS [n] ON [b2].[Id] = [n].[ParentCollectionId] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [t].[Id], [t].[Id0]"); + } + + public override void Nested_include_with_inheritance_collection_reference_reverse_split() + { + base.Nested_include_with_inheritance_collection_reference_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Discriminator], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], [b].[Id], [b].[BaseParentId], [b].[Discriminator], [b].[Name], [b].[DerivedProperty], [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [NestedReferences] AS [n] +LEFT JOIN [BaseCollectionsOnBase] AS [b] ON [n].[ParentCollectionId] = [b].[Id] +LEFT JOIN [BaseEntities] AS [b0] ON [b].[BaseParentId] = [b0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b0].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Nested_include_with_inheritance_collection_collection_split() + { + base.Nested_include_with_inheritance_collection_collection_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Discriminator], [b].[Name], [b].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [b].[OwnedReferenceOnDerived_Id], [b].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [t].[Id], [t].[BaseParentId], [t].[Discriminator], [t].[Name], [t].[DerivedProperty], [t].[Id0], [t].[Discriminator0], [t].[Name0], [t].[ParentCollectionId], [t].[ParentReferenceId] +FROM [BaseEntities] AS [b] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b1] ON [b].[Id] = [b1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b2].[Id], [b2].[BaseParentId], [b2].[Discriminator], [b2].[Name], [b2].[DerivedProperty], [n].[Id] AS [Id0], [n].[Discriminator] AS [Discriminator0], [n].[Name] AS [Name0], [n].[ParentCollectionId], [n].[ParentReferenceId] + FROM [BaseCollectionsOnBase] AS [b2] + LEFT JOIN [NestedCollections] AS [n] ON [b2].[Id] = [n].[ParentCollectionId] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b1].[DerivedInheritanceRelationshipEntityId], [b1].[Id], [t].[Id], [t].[Id0]"); + } + + public override void Nested_include_with_inheritance_collection_collection_reverse_split() + { + base.Nested_include_with_inheritance_collection_collection_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Discriminator], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], [b].[Id], [b].[BaseParentId], [b].[Discriminator], [b].[Name], [b].[DerivedProperty], [b0].[Id], [b0].[Discriminator], [b0].[Name], [b0].[BaseId], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [b0].[OwnedReferenceOnDerived_Id], [b0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id], [b2].[Name] +FROM [NestedCollections] AS [n] +LEFT JOIN [BaseCollectionsOnBase] AS [b] ON [n].[ParentCollectionId] = [b].[Id] +LEFT JOIN [BaseEntities] AS [b0] ON [b].[BaseParentId] = [b0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [BaseEntities_OwnedCollectionOnDerived] AS [b2] ON [b0].[Id] = [b2].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [b].[Id], [b0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b2].[DerivedInheritanceRelationshipEntityId], [b2].[Id]"); + } + + public override void Nested_include_collection_reference_on_non_entity_base_split() + { + base.Nested_include_collection_reference_on_non_entity_base_split(); + + AssertSql( + @"SELECT [r].[Id], [r].[Name], [t].[Id], [t].[Name], [t].[ReferenceId], [t].[ReferencedEntityId], [t].[Id0], [t].[Name0] +FROM [ReferencedEntities] AS [r] +LEFT JOIN ( + SELECT [p].[Id], [p].[Name], [p].[ReferenceId], [p].[ReferencedEntityId], [r0].[Id] AS [Id0], [r0].[Name] AS [Name0] + FROM [PrincipalEntities] AS [p] + LEFT JOIN [ReferencedEntities] AS [r0] ON [p].[ReferenceId] = [r0].[Id] +) AS [t] ON [r].[Id] = [t].[ReferencedEntityId] +ORDER BY [r].[Id], [t].[Id], [t].[Id0]"); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTRelationshipsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTRelationshipsQuerySqlServerTest.cs index bfe91888e2e..dd8930b42a3 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTRelationshipsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTRelationshipsQuerySqlServerTest.cs @@ -1059,6 +1059,497 @@ FROM [BaseEntities] AS [b0] ORDER BY [n].[Id], [t].[Id], [t0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); } + public override void Include_collection_with_inheritance_split() + { + base.Include_collection_with_inheritance_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[DerivedProperty], [t].[IsDerivedCollectionOnBase] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[BaseParentId], [b1].[Name], [d1].[DerivedProperty], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase] + FROM [BaseCollectionsOnBase] AS [b1] + LEFT JOIN [DerivedCollectionsOnBase] AS [d1] ON [b1].[Id] = [d1].[Id] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_reverse_split() + { + base.Include_collection_with_inheritance_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[BaseParentId], [b].[Name], [d].[DerivedProperty], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedCollectionOnBase], [t].[Id], [t].[Name], [t].[BaseId], [t].[IsDerivedInheritanceRelationshipEntity], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[Id1], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [BaseCollectionsOnBase] AS [b] +LEFT JOIN [DerivedCollectionsOnBase] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + LEFT JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t] ON [b].[BaseParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Include_collection_with_inheritance_with_filter_split() + { + base.Include_collection_with_inheritance_with_filter_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[DerivedProperty], [t].[IsDerivedCollectionOnBase] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[BaseParentId], [b1].[Name], [d1].[DerivedProperty], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase] + FROM [BaseCollectionsOnBase] AS [b1] + LEFT JOIN [DerivedCollectionsOnBase] AS [d1] ON [b1].[Id] = [d1].[Id] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_with_filter_reverse_split() + { + base.Include_collection_with_inheritance_with_filter_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[BaseParentId], [b].[Name], [d].[DerivedProperty], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedCollectionOnBase], [t].[Id], [t].[Name], [t].[BaseId], [t].[IsDerivedInheritanceRelationshipEntity], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[Id1], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [BaseCollectionsOnBase] AS [b] +LEFT JOIN [DerivedCollectionsOnBase] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + LEFT JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t] ON [b].[BaseParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Include_collection_without_inheritance_split() + { + base.Include_collection_without_inheritance_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [c].[Id], [c].[Name], [c].[ParentId] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [CollectionsOnBase] AS [c] ON [b].[Id] = [c].[ParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [c].[Id]"); + } + + public override void Include_collection_without_inheritance_reverse_split() + { + base.Include_collection_without_inheritance_reverse_split(); + + AssertSql( + @"SELECT [c].[Id], [c].[Name], [c].[ParentId], [t].[Id], [t].[Name], [t].[BaseId], [t].[IsDerivedInheritanceRelationshipEntity], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[Id1], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name] +FROM [CollectionsOnBase] AS [c] +LEFT JOIN ( + SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b].[Id] AS [Id0], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id] AS [Id1], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b] + LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +) AS [t] ON [c].[ParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [t].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [t].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +ORDER BY [c].[Id], [t].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id]"); + } + + public override void Include_collection_without_inheritance_with_filter_split() + { + base.Include_collection_without_inheritance_with_filter_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [c].[Id], [c].[Name], [c].[ParentId] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN [CollectionsOnBase] AS [c] ON [b].[Id] = [c].[ParentId] +WHERE ([b].[Name] <> N'Bar') OR [b].[Name] IS NULL +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [c].[Id]"); + } + + public override void Include_collection_without_inheritance_with_filter_reverse_split() + { + base.Include_collection_without_inheritance_with_filter_reverse_split(); + + AssertSql( + @"SELECT [c].[Id], [c].[Name], [c].[ParentId], [t].[Id], [t].[Name], [t].[BaseId], [t].[IsDerivedInheritanceRelationshipEntity], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[Id1], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name] +FROM [CollectionsOnBase] AS [c] +LEFT JOIN ( + SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b].[Id] AS [Id0], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id] AS [Id1], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b] + LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +) AS [t] ON [c].[ParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [t].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [t].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +WHERE ([c].[Name] <> N'Bar') OR [c].[Name] IS NULL +ORDER BY [c].[Id], [t].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived1_split() + { + base.Include_collection_with_inheritance_on_derived1_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[DerivedProperty], [t].[IsDerivedCollectionOnBase] +FROM [BaseEntities] AS [b] +INNER JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[BaseParentId], [b1].[Name], [d1].[DerivedProperty], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase] + FROM [BaseCollectionsOnBase] AS [b1] + LEFT JOIN [DerivedCollectionsOnBase] AS [d1] ON [b1].[Id] = [d1].[Id] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived2_split() + { + base.Include_collection_with_inheritance_on_derived2_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t].[Id], [t].[Name], [t].[ParentId], [t].[DerivedInheritanceRelationshipEntityId], [t].[IsDerivedCollectionOnDerived] +FROM [BaseEntities] AS [b] +INNER JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[Name], [b1].[ParentId], [d1].[DerivedInheritanceRelationshipEntityId], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnDerived] + FROM [BaseCollectionsOnDerived] AS [b1] + LEFT JOIN [DerivedCollectionsOnDerived] AS [d1] ON [b1].[Id] = [d1].[Id] +) AS [t] ON [b].[Id] = [t].[ParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived3_split() + { + base.Include_collection_with_inheritance_on_derived3_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t].[Id], [t].[Name], [t].[ParentId], [t].[DerivedInheritanceRelationshipEntityId] +FROM [BaseEntities] AS [b] +INNER JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[Name], [b1].[ParentId], [d1].[DerivedInheritanceRelationshipEntityId] + FROM [BaseCollectionsOnDerived] AS [b1] + INNER JOIN [DerivedCollectionsOnDerived] AS [d1] ON [b1].[Id] = [d1].[Id] +) AS [t] ON [b].[Id] = [t].[DerivedInheritanceRelationshipEntityId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t].[Id]"); + } + + public override void Include_collection_with_inheritance_on_derived_reverse_split() + { + base.Include_collection_with_inheritance_on_derived_reverse_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [b].[ParentId], [d].[DerivedInheritanceRelationshipEntityId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedCollectionOnDerived], [t].[Id], [t].[Name], [t].[BaseId], [t].[Id0], [t].[OwnedReferenceOnBase_Id], [t].[OwnedReferenceOnBase_Name], [t].[Id1], [t].[OwnedReferenceOnDerived_Id], [t].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [BaseCollectionsOnDerived] AS [b] +LEFT JOIN [DerivedCollectionsOnDerived] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + INNER JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t] ON [b].[ParentId] = [t].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_split() + { + base.Nested_include_with_inheritance_reference_collection_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[IsDerivedReferenceOnBase], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name], [t0].[Id], [t0].[Name], [t0].[ParentCollectionId], [t0].[ParentReferenceId], [t0].[IsNestedCollectionDerived] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[BaseParentId], [b0].[Name], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedReferenceOnBase] + FROM [BaseReferencesOnBase] AS [b0] + LEFT JOIN [DerivedReferencesOnBase] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [b].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsNestedCollectionDerived] + FROM [NestedCollections] AS [n] + LEFT JOIN [NestedCollectionsDerived] AS [n0] ON [n].[Id] = [n0].[Id] +) AS [t0] ON [t].[Id] = [t0].[ParentReferenceId] +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [t0].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_on_base_split() + { + base.Nested_include_with_inheritance_reference_collection_on_base_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[IsDerivedReferenceOnBase], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name], [t0].[Id], [t0].[Name], [t0].[ParentCollectionId], [t0].[ParentReferenceId], [t0].[IsNestedCollectionDerived] +FROM [BaseEntities] AS [b] +INNER JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[BaseParentId], [b0].[Name], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedReferenceOnBase] + FROM [BaseReferencesOnBase] AS [b0] + LEFT JOIN [DerivedReferencesOnBase] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t] ON [b].[Id] = [t].[BaseParentId] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [b].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [b].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsNestedCollectionDerived] + FROM [NestedCollections] AS [n] + LEFT JOIN [NestedCollectionsDerived] AS [n0] ON [n].[Id] = [n0].[Id] +) AS [t0] ON [t].[Id] = [t0].[ParentReferenceId] +ORDER BY [b].[Id], [t].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [t0].[Id]"); + } + + public override void Nested_include_with_inheritance_reference_collection_reverse_split() + { + base.Nested_include_with_inheritance_reference_collection_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsNestedCollectionDerived], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[IsDerivedReferenceOnBase], [t0].[Id], [t0].[Name], [t0].[BaseId], [t0].[IsDerivedInheritanceRelationshipEntity], [t0].[Id0], [t0].[OwnedReferenceOnBase_Id], [t0].[OwnedReferenceOnBase_Name], [t0].[Id1], [t0].[OwnedReferenceOnDerived_Id], [t0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [NestedCollections] AS [n] +LEFT JOIN [NestedCollectionsDerived] AS [n0] ON [n].[Id] = [n0].[Id] +LEFT JOIN ( + SELECT [b].[Id], [b].[BaseParentId], [b].[Name], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedReferenceOnBase] + FROM [BaseReferencesOnBase] AS [b] + LEFT JOIN [DerivedReferencesOnBase] AS [d] ON [b].[Id] = [d].[Id] +) AS [t] ON [n].[ParentReferenceId] = [t].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + LEFT JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t0] ON [t].[BaseParentId] = [t0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t0].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [t].[Id], [t0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Nested_include_with_inheritance_collection_reference_split() + { + base.Nested_include_with_inheritance_collection_reference_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t0].[Id], [t0].[BaseParentId], [t0].[Name], [t0].[DerivedProperty], [t0].[IsDerivedCollectionOnBase], [t0].[Id0], [t0].[Name0], [t0].[ParentCollectionId], [t0].[ParentReferenceId], [t0].[IsNestedReferenceDerived] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[BaseParentId], [b1].[Name], [d1].[DerivedProperty], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase], [t].[Id] AS [Id0], [t].[Name] AS [Name0], [t].[ParentCollectionId], [t].[ParentReferenceId], [t].[IsNestedReferenceDerived] + FROM [BaseCollectionsOnBase] AS [b1] + LEFT JOIN [DerivedCollectionsOnBase] AS [d1] ON [b1].[Id] = [d1].[Id] + LEFT JOIN ( + SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsNestedReferenceDerived] + FROM [NestedReferences] AS [n] + LEFT JOIN [NestedReferencesDerived] AS [n0] ON [n].[Id] = [n0].[Id] + ) AS [t] ON [b1].[Id] = [t].[ParentCollectionId] +) AS [t0] ON [b].[Id] = [t0].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t0].[Id], [t0].[Id0]"); + } + + public override void Nested_include_with_inheritance_collection_reference_reverse_split() + { + base.Nested_include_with_inheritance_collection_reference_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsNestedReferenceDerived], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[DerivedProperty], [t].[IsDerivedCollectionOnBase], [t0].[Id], [t0].[Name], [t0].[BaseId], [t0].[IsDerivedInheritanceRelationshipEntity], [t0].[Id0], [t0].[OwnedReferenceOnBase_Id], [t0].[OwnedReferenceOnBase_Name], [t0].[Id1], [t0].[OwnedReferenceOnDerived_Id], [t0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [NestedReferences] AS [n] +LEFT JOIN [NestedReferencesDerived] AS [n0] ON [n].[Id] = [n0].[Id] +LEFT JOIN ( + SELECT [b].[Id], [b].[BaseParentId], [b].[Name], [d].[DerivedProperty], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase] + FROM [BaseCollectionsOnBase] AS [b] + LEFT JOIN [DerivedCollectionsOnBase] AS [d] ON [b].[Id] = [d].[Id] +) AS [t] ON [n].[ParentCollectionId] = [t].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + LEFT JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t0] ON [t].[BaseParentId] = [t0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t0].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [t].[Id], [t0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Nested_include_with_inheritance_collection_collection_split() + { + base.Nested_include_with_inheritance_collection_collection_split(); + + AssertSql( + @"SELECT [b].[Id], [b].[Name], [d].[BaseId], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsDerivedInheritanceRelationshipEntity], [b].[OwnedReferenceOnBase_Id], [b].[OwnedReferenceOnBase_Name], [d].[Id], [d].[OwnedReferenceOnDerived_Id], [d].[OwnedReferenceOnDerived_Name], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [b0].[Name], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [d0].[Name], [t0].[Id], [t0].[BaseParentId], [t0].[Name], [t0].[DerivedProperty], [t0].[IsDerivedCollectionOnBase], [t0].[Id0], [t0].[Name0], [t0].[ParentCollectionId], [t0].[ParentReferenceId], [t0].[IsNestedCollectionDerived] +FROM [BaseEntities] AS [b] +LEFT JOIN [DerivedEntities] AS [d] ON [b].[Id] = [d].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b0] ON [b].[Id] = [b0].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d0] ON [b].[Id] = [d0].[DerivedInheritanceRelationshipEntityId] +LEFT JOIN ( + SELECT [b1].[Id], [b1].[BaseParentId], [b1].[Name], [d1].[DerivedProperty], CASE + WHEN [d1].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase], [t].[Id] AS [Id0], [t].[Name] AS [Name0], [t].[ParentCollectionId], [t].[ParentReferenceId], [t].[IsNestedCollectionDerived] + FROM [BaseCollectionsOnBase] AS [b1] + LEFT JOIN [DerivedCollectionsOnBase] AS [d1] ON [b1].[Id] = [d1].[Id] + LEFT JOIN ( + SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsNestedCollectionDerived] + FROM [NestedCollections] AS [n] + LEFT JOIN [NestedCollectionsDerived] AS [n0] ON [n].[Id] = [n0].[Id] + ) AS [t] ON [b1].[Id] = [t].[ParentCollectionId] +) AS [t0] ON [b].[Id] = [t0].[BaseParentId] +ORDER BY [b].[Id], [b0].[BaseInheritanceRelationshipEntityId], [b0].[Id], [d0].[DerivedInheritanceRelationshipEntityId], [d0].[Id], [t0].[Id], [t0].[Id0]"); + } + + public override void Nested_include_with_inheritance_collection_collection_reverse_split() + { + base.Nested_include_with_inheritance_collection_collection_reverse_split(); + + AssertSql( + @"SELECT [n].[Id], [n].[Name], [n].[ParentCollectionId], [n].[ParentReferenceId], CASE + WHEN [n0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END AS [IsNestedCollectionDerived], [t].[Id], [t].[BaseParentId], [t].[Name], [t].[DerivedProperty], [t].[IsDerivedCollectionOnBase], [t0].[Id], [t0].[Name], [t0].[BaseId], [t0].[IsDerivedInheritanceRelationshipEntity], [t0].[Id0], [t0].[OwnedReferenceOnBase_Id], [t0].[OwnedReferenceOnBase_Name], [t0].[Id1], [t0].[OwnedReferenceOnDerived_Id], [t0].[OwnedReferenceOnDerived_Name], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [b1].[Name], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id], [d1].[Name] +FROM [NestedCollections] AS [n] +LEFT JOIN [NestedCollectionsDerived] AS [n0] ON [n].[Id] = [n0].[Id] +LEFT JOIN ( + SELECT [b].[Id], [b].[BaseParentId], [b].[Name], [d].[DerivedProperty], CASE + WHEN [d].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedCollectionOnBase] + FROM [BaseCollectionsOnBase] AS [b] + LEFT JOIN [DerivedCollectionsOnBase] AS [d] ON [b].[Id] = [d].[Id] +) AS [t] ON [n].[ParentCollectionId] = [t].[Id] +LEFT JOIN ( + SELECT [b0].[Id], [b0].[Name], [d0].[BaseId], CASE + WHEN [d0].[Id] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END AS [IsDerivedInheritanceRelationshipEntity], [b0].[Id] AS [Id0], [b0].[OwnedReferenceOnBase_Id], [b0].[OwnedReferenceOnBase_Name], [d0].[Id] AS [Id1], [d0].[OwnedReferenceOnDerived_Id], [d0].[OwnedReferenceOnDerived_Name] + FROM [BaseEntities] AS [b0] + LEFT JOIN [DerivedEntities] AS [d0] ON [b0].[Id] = [d0].[Id] +) AS [t0] ON [t].[BaseParentId] = [t0].[Id] +LEFT JOIN [BaseEntities_OwnedCollectionOnBase] AS [b1] ON [t0].[Id] = [b1].[BaseInheritanceRelationshipEntityId] +LEFT JOIN [DerivedEntities_OwnedCollectionOnDerived] AS [d1] ON [t0].[Id] = [d1].[DerivedInheritanceRelationshipEntityId] +ORDER BY [n].[Id], [t].[Id], [t0].[Id], [b1].[BaseInheritanceRelationshipEntityId], [b1].[Id], [d1].[DerivedInheritanceRelationshipEntityId], [d1].[Id]"); + } + + public override void Nested_include_collection_reference_on_non_entity_base_split() + { + base.Nested_include_collection_reference_on_non_entity_base_split(); + + AssertSql( + @"SELECT [r].[Id], [r].[Name], [t].[Id], [t].[Name], [t].[ReferenceId], [t].[ReferencedEntityId], [t].[Id0], [t].[Name0] +FROM [ReferencedEntities] AS [r] +LEFT JOIN ( + SELECT [p].[Id], [p].[Name], [p].[ReferenceId], [p].[ReferencedEntityId], [r0].[Id] AS [Id0], [r0].[Name] AS [Name0] + FROM [PrincipalEntities] AS [p] + LEFT JOIN [ReferencedEntities] AS [r0] ON [p].[ReferenceId] = [r0].[Id] +) AS [t] ON [r].[Id] = [t].[ReferencedEntityId] +ORDER BY [r].[Id], [t].[Id], [t].[Id0]"); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/InheritanceRelationshipsQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/InheritanceRelationshipsQuerySqliteTest.cs index 3982a3d4684..21d5e04c545 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/InheritanceRelationshipsQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/InheritanceRelationshipsQuerySqliteTest.cs @@ -6,7 +6,7 @@ namespace Microsoft.EntityFrameworkCore.Query { public class InheritanceRelationshipsQuerySqliteTest : - InheritanceRelationshipsQueryTestBase + InheritanceRelationshipsQueryRelationalTestBase { public InheritanceRelationshipsQuerySqliteTest(InheritanceRelationshipsQuerySqliteFixture fixture) : base(fixture)