首页 > 解决方案 > 查询具有不同包含的基和子类型

问题描述

我有一个类型和子类型

public class Reservation
{
   public int Id {get; set;}
   public TimeSpan Length {get; set;}
}
public class Appointment : Reservation
{
   public Customer Customer {get; set;}
}

数据库上下文

public DbSet<Reservation> Reservations { get; set; }
public DbSet<Appointment> Appointments { get; set; }

每个层次结构表 (TPH) 是当前设置,因为它是 ef core 3.1 的唯一选项。

现在我想查询超集Reservations并包括Customerwhen a Reservationis Appointment。我试着像这样union使用IQueryable

var reservations = context.Appointments.Include(e => e.Customer)
                   .Union(context.Reservations)

但我明白了

InvalidOperationException: '执行集合操作时,两个操作数必须具有相同的包含操作

虽然可以Union在内存中执行。我想执行一次可以节省一天的行程查询。EntityFramework core 5如果解决方案仅存在于那里,我可能会迁移到。

编辑:https ://github.com/dotnet/efcore/issues/16298

标签: c#entity-framework-coreentity-framework-core-3.1

解决方案


我会建议这种方法,但不确定它是否适用于 EF Core,因为它在 Concat/Union 方面存在问题。您的案例也需要Concat- UNION ALL,而不是Union- UNION

var query1 = 
    context.Appointments.Select(e => new Appointment
    {
        Id = e.Id,
        Length = e.Length,
        Cutomer = e.Customer 
    });

 var query2 = 
    context.Reservations.Select(e => new Appointment
    {
        Id = e.Id,
        Length = e.Length,
     }); 

var query = query1.Concat(query2);

如果您需要具体的类,则必须在客户端进行转换。在 ChangeTracker 中也只有记录器的客户。


推荐阅读