Improve query: don't select id twice in a union with owned entity
- Dominant language
- C#
- Stars
- 14.8k
- Forks
- 3.4k
- PR merge metrics
- PR metrics pending
Description
## File a bug
Extra columns retrieved with Union and owned entity:
```sql
SELECT [p].[Id], [p].[Id] AS [Id0], [p].[HomeAddress_StreetNumber]
FROM [People] AS [p]
UNION
SELECT [p0].[Id], [p0].[Id] AS [Id0], [p0].[HomeAddress_StreetNumber]
FROM [People] AS [p0]
```
`[p0].[Id] AS [Id0]` is redundant.
### Include your code
To fix any bug we must first reproduce it. To make this possible, please attach a small, runnable project or post a small, runnable code listing that reproduces what you are seeing.
It is often impossible for us to reproduce a bug when working with only code snippets since we have to guess at the missing code.
Use triple-tick code fences for any posted code. For example:
```C#
using Microsoft.EntityFrameworkCore;
using var context = new MyDbContext();
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
var query = context.People.Select(z => new { z.Id, z.HomeAddress })
.Union(context.People.Select(z => new { z.Id, z.HomeAddress }));
var queryStr = query.AsNoTracking().ToQueryString();
Console.WriteLine(queryStr);
public class MyDbContext : DbContext
{
public DbSet People { get; set; } = default!;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
//.UseSqlServer(FiddleHelper.GetConnectionStringSqlServer()).LogTo(Console.WriteLine);
.UseSqlServer($@"Server=(localdb)\mssqllocaldb;Database={GetType().Assembly.GetName().Name};Trusted_Connection=True").LogTo(Console.WriteLine);
}
public class Person
{
public Guid Id { get; set; }
public int SocialInsuranceNumber { get; set; }
public StreetAddress HomeAddress { get; set; }
}
[Owned]
public class StreetAddress
{
public int StreetNumber { get; set; }
}
```
### Include verbose output
```
dbug: 2023-10-22 22:04:17.998 CoreEventId.ShadowPropertyCreated[10600] (Microsoft.EntityFrameworkCore.Model.Validation)
The property 'StreetAddress.PersonId' was created in shadow state because there are no eligible CLR members with a matching name.
dbug: 2023-10-22 22:04:18.618 CoreEventId.ContextInitialized[10403] (Microsoft.EntityFrameworkCore.Infrastructure)
Entity Framework Core 8.0.0-rc.2.23480.1 initialized 'MyDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer:8.0.0-rc.2.23480.1' with options: None
dbug: 2023-10-22 22:04:18.714 RelationalEventId.ConnectionCreating[20005] (Microsoft.EntityFrameworkCore.Database.Connection)
Creating DbConnection.
dbug: 2023-10-22 22:04:18.864 RelationalEventId.ConnectionCreated[20006] (Microsoft.EntityFrameworkCore.Database.Connection)
Created DbConnection. (148ms).
dbug: 2023-10-22 22:04:18.875 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:19.888 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:19.921 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:19.944 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (19ms).
dbug: 2023-10-22 22:04:19.952 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (36ms).
dbug: 2023-10-22 22:04:19.973 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT 1
info: 2023-10-22 22:04:20.136 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (150ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT 1
dbug: 2023-10-22 22:04:20.156 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:20.192 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'Contains' on server '(localdb)\mssqllocaldb' (24ms).
dbug: 2023-10-22 22:04:20.339 RelationalEventId.ConnectionCreating[20005] (Microsoft.EntityFrameworkCore.Database.Connection)
Creating DbConnection.
dbug: 2023-10-22 22:04:20.341 RelationalEventId.ConnectionCreated[20006] (Microsoft.EntityFrameworkCore.Database.Connection)
Created DbConnection. (2ms).
dbug: 2023-10-22 22:04:20.369 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:20.482 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:20.495 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:20.521 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (25ms).
dbug: 2023-10-22 22:04:20.533 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (37ms).
dbug: 2023-10-22 22:04:20.575 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [Contains] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
END;
info: 2023-10-22 22:04:20.942 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (367ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [Contains] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
END;
dbug: 2023-10-22 22:04:20.945 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:20.959 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (14ms).
dbug: 2023-10-22 22:04:20.996 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (51ms).
dbug: 2023-10-22 22:04:21.003 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='60']
DROP DATABASE [Contains];
info: 2023-10-22 22:04:21.151 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (148ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
DROP DATABASE [Contains];
dbug: 2023-10-22 22:04:21.153 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.154 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'master' on server '(localdb)\mssqllocaldb' (0ms).
dbug: 2023-10-22 22:04:21.211 RelationalEventId.ConnectionDisposing[20007] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposing connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.233 RelationalEventId.ConnectionDisposed[20008] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposed connection to database '' on server '' (20ms).
dbug: 2023-10-22 22:04:21.261 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.530 RelationalEventId.ConnectionError[20004] (Microsoft.EntityFrameworkCore.Database.Connection)
An error occurred using the connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.594 CoreEventId.ShadowPropertyCreated[10600] (Microsoft.EntityFrameworkCore.Model.Validation)
The property 'StreetAddress.PersonId' was created in shadow state because there are no eligible CLR members with a matching name.
dbug: 2023-10-22 22:04:21.663 RelationalEventId.ConnectionCreating[20005] (Microsoft.EntityFrameworkCore.Database.Connection)
Creating DbConnection.
dbug: 2023-10-22 22:04:21.666 RelationalEventId.ConnectionCreated[20006] (Microsoft.EntityFrameworkCore.Database.Connection)
Created DbConnection. (3ms).
dbug: 2023-10-22 22:04:21.706 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.720 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:21.754 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:21.763 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (8ms).
dbug: 2023-10-22 22:04:21.806 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (51ms).
dbug: 2023-10-22 22:04:21.819 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='60']
CREATE DATABASE [Contains];
info: 2023-10-22 22:04:22.535 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (714ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
CREATE DATABASE [Contains];
dbug: 2023-10-22 22:04:22.538 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:22.539 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (1ms).
dbug: 2023-10-22 22:04:22.574 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (35ms).
dbug: 2023-10-22 22:04:22.583 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [Contains] SET READ_COMMITTED_SNAPSHOT ON;
END;
info: 2023-10-22 22:04:23.014 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (431ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [Contains] SET READ_COMMITTED_SNAPSHOT ON;
END;
dbug: 2023-10-22 22:04:23.021 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:23.048 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'master' on server '(localdb)\mssqllocaldb' (26ms).
dbug: 2023-10-22 22:04:23.058 RelationalEventId.ConnectionDisposing[20007] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposing connection to database 'master' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:23.078 RelationalEventId.ConnectionDisposed[20008] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposed connection to database '' on server '' (20ms).
dbug: 2023-10-22 22:04:23.086 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:23.577 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:23.579 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:23.600 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (20ms).
dbug: 2023-10-22 22:04:23.608 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (28ms).
dbug: 2023-10-22 22:04:23.624 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT 1
info: 2023-10-22 22:04:23.656 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (32ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT 1
dbug: 2023-10-22 22:04:23.675 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:23.699 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'Contains' on server '(localdb)\mssqllocaldb' (23ms).
dbug: 2023-10-22 22:04:24.002 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:24.004 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:24.040 RelationalEventId.TransactionStarting[20209] (Microsoft.EntityFrameworkCore.Database.Transaction)
Beginning transaction with isolation level 'Unspecified'.
dbug: 2023-10-22 22:04:24.072 RelationalEventId.TransactionStarted[20200] (Microsoft.EntityFrameworkCore.Database.Transaction)
Began transaction with isolation level 'ReadCommitted'.
dbug: 2023-10-22 22:04:24.081 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteNonQuery'.
dbug: 2023-10-22 22:04:24.107 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteNonQuery' (25ms).
dbug: 2023-10-22 22:04:24.116 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteNonQuery' (35ms).
dbug: 2023-10-22 22:04:24.141 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [People] (
[Id] uniqueidentifier NOT NULL,
[SocialInsuranceNumber] int NOT NULL,
[HomeAddress_StreetNumber] int NOT NULL,
CONSTRAINT [PK_People] PRIMARY KEY ([Id])
);
info: 2023-10-22 22:04:24.206 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (66ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [People] (
[Id] uniqueidentifier NOT NULL,
[SocialInsuranceNumber] int NOT NULL,
[HomeAddress_StreetNumber] int NOT NULL,
CONSTRAINT [PK_People] PRIMARY KEY ([Id])
);
dbug: 2023-10-22 22:04:24.221 RelationalEventId.TransactionCommitting[20210] (Microsoft.EntityFrameworkCore.Database.Transaction)
Committing transaction.
dbug: 2023-10-22 22:04:24.253 RelationalEventId.TransactionCommitted[20202] (Microsoft.EntityFrameworkCore.Database.Transaction)
Committed transaction.
dbug: 2023-10-22 22:04:24.277 RelationalEventId.TransactionDisposed[20204] (Microsoft.EntityFrameworkCore.Database.Transaction)
Disposing transaction.
dbug: 2023-10-22 22:04:24.288 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:24.312 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'Contains' on server '(localdb)\mssqllocaldb' (23ms).
dbug: 2023-10-22 22:04:24.480 CoreEventId.QueryCompilationStarting[10111] (Microsoft.EntityFrameworkCore.Query)
Compiling query expression:
'DbSet()
.Select(z => new {
Id = z.Id,
HomeAddress = z.HomeAddress
})
.Union(DbSet()
.Select(z => new {
Id = z.Id,
HomeAddress = z.HomeAddress
}))
.AsNoTracking()'
dbug: 2023-10-22 22:04:25.515 CoreEventId.QueryExecutionPlanned[10107] (Microsoft.EntityFrameworkCore.Query)
Generated query execution expression:
'queryContext => new SingleQueryingEnumerable<<>f__AnonymousType0>(
(RelationalQueryContext)queryContext,
RelationalCommandCache.QueryExpression(
Projection Mapping:
Id -> 0
HomeAddress -> Dictionary { [Property: StreetAddress.PersonId (no field, Guid) Shadow Required PK FK AfterSave:Throw, 1], [Property: StreetAddress.StreetNumber (int) Required, 2] }
SELECT t.Id, t.Id0, t.HomeAddress_StreetNumber
FROM (
SELECT p.Id, p.Id AS Id0, p.HomeAddress_StreetNumber
FROM People AS p
UNION
SELECT p0.Id, p0.Id AS Id0, p0.HomeAddress_StreetNumber
FROM People AS p0
) AS t
),
null,
Funcf__AnonymousType0>,
MyDbContext,
False,
False,
True
)'
SELECT [p].[Id], [p].[Id] AS [Id0], [p].[HomeAddress_StreetNumber]
FROM [People] AS [p]
UNION
SELECT [p0].[Id], [p0].[Id] AS [Id0], [p0].[HomeAddress_StreetNumber]
FROM [People] AS [p0]
dbug: 2023-10-22 22:04:25.651 CoreEventId.ContextDisposed[10407] (Microsoft.EntityFrameworkCore.Infrastructure)
'MyDbContext' disposed.
dbug: 2023-10-22 22:04:25.668 RelationalEventId.ConnectionDisposing[20007] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposing connection to database 'Contains' on server '(localdb)\mssqllocaldb'.
dbug: 2023-10-22 22:04:25.690 RelationalEventId.ConnectionDisposed[20008] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposed connection to database '' on server '' (21ms).
Q:\Code\Issues\dotnet\efcore\Contains\Contains\bin\Debug\net8.0\Contains.exe (process 39568) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
```
### Include provider and version information
EF Core version: EF 8 RC 2
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: .NET 8.0 RC 2
Operating system: Windows 11
Contributor guide
Assessment
This issue has not been assessed yet.