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

时间:2015-01-18 03:20:11

标签: c# entity-framework

我有很多DbSet悬挂在我的DbContext上。每个DbSets的泛型类型都来自一个公共基类。

如何在所有DbSets中查询基类中的公共属性?

为了说明,比方说我有以下两个DbSets:

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; }
}

如何在所有DbSet中选择ExampleProperty的值?对于我认可的例子,我可以做一个简单的联合,但我正在寻找一种简单的方法来查询所有持有EntityBase类型的DbSets,因为我有数百个。

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

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

我如何为所有实体做同样的事情?

2 个答案:

答案 0 :(得分:0)

如果每个实体在数据库中都有自己的表,那么每个实体都拥有它自己的ExampleProperty,因此您必须查询ExampleProperty的所有实体,如下所示:

var exampleProperties =
    from p in typeof(YourDbContext).GetProperties()
    where p.PropertyType.IsGenericType
    && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)
    let entityType = p.PropertyType.GetGenericArguments().First()
    where typeof(EntityBase).IsAssignableFrom(entityType)
    select p.ExampleProperty;

答案 1 :(得分:0)

我能够使用以下查询获取我需要的数据(我更喜欢流畅的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类型的所有列,这会将相当多的数据提取到内存中。