c# - 查询具有不同包含的基和子类型
问题描述
我有一个类型和子类型
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
并包括Customer
when a Reservation
is Appointment
。我试着像这样union
使用IQueryable
var reservations = context.Appointments.Include(e => e.Customer)
.Union(context.Reservations)
但我明白了
InvalidOperationException: '执行集合操作时,两个操作数必须具有相同的包含操作
虽然可以Union
在内存中执行。我想执行一次可以节省一天的行程查询。EntityFramework core 5
如果解决方案仅存在于那里,我可能会迁移到。
解决方案
我会建议这种方法,但不确定它是否适用于 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 中也只有记录器的客户。
推荐阅读
- javascript - 你能用玩笑只模拟外部模块的一部分吗?
- javascript - 解析仪表板 bundle.js net::ERR_ABORTED 404(未找到)
- reactjs - 如何在 Material UI 中实现 ScrollToTop
- python - 如何重构以避免传递函数?
- javascript - 无法从对象中的函数获取返回
- javascript - 通过 URL 对象设置参数值与设置为字符串
- javascript - 范围控件在将它们放入表单后不再起作用(javascript)
- lua - 是否可以转储类型 userdata 变量的属性/方法?
- javascript - 我正在尝试通过访问嵌套属性并检查它的属性值是否包含某个字符串来过滤数组中的项目
- html - 为图像添加黑色透明度