簡體   English   中英

實體框架中跨多個DbSet的查詢屬性

[英]Query property across multiple DbSets in Entity Framework

我在DbSet懸掛了許多DbContext 這些DbSet中的每個DbSet的通用類型都來自一個公共基類。

如何在所有DbSet的基類中查詢公共屬性?

為了說明這一點,例如,我有以下兩個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; }
}

如何在所有ExampleProperty選擇ExampleProperty的值? 對於我想做的示例,我可以做一個簡單的聯合,但是我正在尋找一種簡單的方法來查詢所有從EntityBase派生的DbSet持有類型,因為我有數百種。

我可以按以下方式查詢變更跟蹤器,但這僅適用於具有待處理變更的實體。

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

如何為所有實體做同樣的事情?

如果每個實體在數據庫中都有自己的表,那么每個實體都有自己的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;

我可以使用以下查詢獲取所需的數據(我更喜歡流利的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類型的所有列,這會將大量數據拉到內存中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM