为实现同一接口的三个不同实体创建Union

本文关键字:三个 创建 Union 实体 实现 接口 | 更新日期: 2023-09-27 17:58:29

我有三个实体:RatedPrice、DailyPrice和UtilizePrice
每个实体都有Code成员。

我想编写一个lambda查询,返回按代码排序的三个成员中的IQueryable。我知道我需要在联盟的某个地方使用,但我不知道如何使用。此外,这三个实体都有不同之处,但都实现了IPrice。

如何进行查询?

为实现同一接口的三个不同实体创建Union

您必须使用这样的东西:

var data = ctx.RatedPrices.Select(p => new { p.Code, p.Price })
              .Concat(ctx.DailyPrices.Select(p => new { p.Code, p.Price })
                         .Contact(ctx.UtilizePrices.Select(p => new { p.Code, p.Price }))
              .OrderBy(p => p.Code);

实体框架和linq-to实体不知道什么是接口。您必须对某些未映射的类型(示例中为匿名类型)使用投影并处理结果。因为您不使用来自某些基本Price的实体继承(否则您就不需要它),所以您不能指望EF会在单个结果集中返回RetedPriceDailyPriceUtilizePrice的实例。

像这样的东西可能是

var list = listRatedPrice.Cast<IPrice>()
.Concat(listDailyPrice.Cast<IPrice>()
.Concat(listUtilizePrice.Cast<IPrice>))).Orderby(p => p.Code);