在 Entity Framework Core 3.1.3 中,我使用了值对象功能。在查询方面,问题是 T-SQL 中存在额外的左连接。这种额外的连接会导致性能问题。在以下代码中,Student 是实体类型,Address 类是值类型。
实体
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}
数据库上下文
public class ApplicationDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Student>().OwnsOne(e => e.Address);
base.OnModelCreating(builder);
}
}
Entity Framework 查询
var list = _dbContext.Students.ToList();
为此 EF 查询生成的 T-SQL:
SELECT [s].[Id], [s].[Name], [t].[Id], [t].[Address_City],
[t].[Address_Street], [t].[Address_ZipCode]
FROM [Students] AS [s]
LEFT JOIN (
SELECT [s0].[Id], [s0].[Address_City],
[s0].[Address_Street], [s0].[Address_ZipCode]
FROM [Students] AS [s0]
WHERE [s0].[Address_ZipCode] IS NOT NULL OR
([s0].[Address_Street] IS NOT NULL OR
[s0].[Address_City] IS NOT NULL)
) AS [t] ON [s].[Id] = [t].[Id]
最佳答案
这是 EF Core 3.0 新查询处理管道引入的错误,很可能与以下重大更改相关 Dependent entities sharing the table with the principal are now optional ,它应该修复一些用户请求的场景,但实际上破坏了许多其他场景。
目前由 #18299: Query on owned entity produces overly complicated SQL 追踪不幸的是,这个问题似乎不会在 3.1 中得到修复,所以人们预计会等待 5.0 的发布。与此同时,您对此无能为力。
关于asp.net-core - Entity Framework Core 中值对象查询中的额外联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61052328/