在 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; }
Person
和 Vehicle
均派生自 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 类型的所有列,这会将相当多的数据拉入内存。
我有相当多的 DbSet
挂在我的 DbContext
上。这些 DbSet 中的每一个的通用类型都派生自一个公共基 class.
如何在所有 DbSet 中查询基础 class 中的公共 属性?
举例来说,我有以下两个 DbSet:
public DbSet<Person> People { get; set; }
public DbSet<Vehicle> Vehicles { get; set; }
Person
和 Vehicle
均派生自 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 类型的所有列,这会将相当多的数据拉入内存。