在 Entity Framework 中跨多个 DbSet 查询 属性

Query property across multiple DbSets in Entity Framework

我有相当多的 DbSet 挂在我的 DbContext 上。这些 DbSet 中的每一个的通用类型都派生自一个公共基 class.

如何在所有 DbSet 中查询基础 class 中的公共 属性?

举例来说,我有以下两个 DbSet:

public DbSet<Person> People { get; set; }
public DbSet<Vehicle> Vehicles { get; set; }

PersonVehicle 均派生自 EntityBase

public class Person : EntityBase {
...
}

public class Vehicle : EntityBase {
...
}

EntityBase定义如下:

public class EntityBase {
    public virtual string ExampleProperty { get; set; }
}

如何 select ExampleProperty 的值跨越所有 DbSet?对于我设计的例子,我可以做一个简单的联合,但我正在寻找一种简单的方法来查询所有 DbSets 持有从 EntityBase 派生的类型,因为我有数百个。

我可以按如下方式查询更改跟踪器,但这仅适用于具有未决更改的实体。

dbContext.ChangeTracker
         .Entries<EntityBase>()
         .Select(obj => obj.Entity)
         .Select(obj => obj.ExampleProperty);

我怎样才能对所有实体做同样的事情?

我能够使用以下查询获取我需要的数据(我更喜欢流畅的 API):

dbContext.GetType().GetProperties()
.Where(p => p.PropertyType.IsGenericType)
.Where(p => p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
.Where(p => p.PropertyType.GetGenericArguments().First().IsSubclassOf(typeof(EntityBase)))
.SelectMany(p => (IEnumerable<EntityBase>)p.GetValue(dbContext, null))
.Select(obj => obj.ExampleProperty);

不幸的是,生成的 SQL 正在查询每种 DBSet 类型的所有列,这会将相当多的数据拉入内存。