Entity Framework:查询多种类型

Entity Framework: Query Multiple Types

我有一个带继承的 EF6 代码优先模型,例如:

[Table("Things")]
abstract class AbstractThing
{
   public int ThingId { get; set; }
   public string Color { get; set; }
}

class Car : AbstractThing
{
   public string Brand { get; set; }
}

class Balloon : AbstractThing
{
   public double Price { get; set; }
}

class Animal : AbstractThing
{
   public int LegCount { get; set; }
}

我使用 table-per-hierarchy,所以我的 "Things" table 将包含以下列:

现在,我想查询特定类型的事物,但此类型列表是动态的。例如。我想要所有红色的东西,比如汽车或气球。在 SQL 中,这很容易完成,因为我可以编译一个 where Discriminator in ('Car', 'Ballon') 子句。

这里的问题是,据我所知,在 EF Linq2SQL 中按类型过滤的唯一方法是使用 .OfType 方法(或使用特定集合)。但是后来我取回了只包含该类型的过滤列表,我不能使用 'OR' 或 'IN' 子句。如果不显式查询每个集合并建立并集,我真的不知道该怎么做:

var queryable = Enumerable.Empty<Thing>().AsQueryable();

if (typesRequested.Contains(typeof(Car)))
{
   queryable = queryable.Union(context.Things.OfType<Car>());
}
if (typesRequested.Contains(typeof(Balloon)))
{
   queryable = queryable.Union(context.Things.OfType<Balloon>());
}
if (typesRequested.Contains(typeof(Animal)))
{
   queryable = queryable.Union(context.Things.OfType<Animal>());
}

因为在我的实际模型中,我有更多的继承类型,这种方法不太可行。我现在采用的解决方法是使用自定义 'type' 列,该列与 'Discriminator' 列冗余,但这很容易出错并创建样板代码。

是否有任何其他方法可以将可查询动态限制为 return 仅一组特定类型?

对于 EF Core,这似乎是可能的:'Discriminator' 属性 现在可以作为 影子 属性 使用。 (https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance#configuring-the-discriminator-property )

即:

var types = typesRequested.Select(x => x.Name).ToArray();
var filteredByType = context.Things.Where(tng => 
                 types.Contains(EF.Property<string>(tng, "Discriminator")));