7

Wie bekomme ich eine List aller DbSets, wo der enthaltene Typ von IncomingServiceOrderBase abgeleitet ist?Wie kann ich alle DbSets finden, deren generische Typen von einem bestimmten Basistyp abgeleitet sind?

Ich kann Reflektion verwenden, um alle DbSets zu erhalten, aber wie filtere ich es auf nur diejenigen, die einen abgeleiteten Typ enthalten?

Kontext

public class MyContext : DbContext 
{ 
    public DbSet<BuildingOrder> BuildingOrders { get; set; } 
    public DbSet<DeliveryOrder> DeliveryOrders { get; set; } 
    public DbSet<RetailAssemblyOrder> RetailAssemblyOrders { get; set; } 
} 

Modell

public class BuildingOrder : IncomingManufacturedProductOrderBase { } 
public class DeliveryOrder : IncomingServiceOrderBase { } 
public class RetailAssemblyOrder : IncomingServiceOrderBase { } 

Antwort

18

Sie können somehing wie folgt tun:

var sets = 
    from p in typeof(MyContext).GetProperties() 
    where p.PropertyType.IsGenericType 
    && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>) 
    let entityType = p.PropertyType.GetGenericArguments().First() 
    where typeof(IncomingServiceOrderBase).IsAssignableFrom(entityType) 
    select p.Name; 

(Dies gibt die Namen der Eigenschaften zurück; wenn Sie die tatsächlichen DbSet-Instanzen möchten, ersetzen Sie p.Name durch p.GetValue(context, null))

2

typeof(BaseType).IsAssignableFrom(DerivedType). Es wird wahr/falsch zurückgegeben. Siehe http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

DbSet<T> in T So schalten (so kann man diesen Vergleich tun) nehmen jede Art der Unterkunft und etwas tun, wie folgt aus:

public static Type GetGenericBaseType(this Type Type) { 
     if (Type == null) { 
      throw new ArgumentNullException("Type"); 
     } 
     if (!Type.IsGenericType) { 
      throw new ArgumentOutOfRangeException("Type", Type.FullName + " isn't Generic"); 
     } 
     Type[] args = Type.GetGenericArguments(); 
     if (args.Length != 1) { 
      throw new ArgumentOutOfRangeException("Type", Type.FullName + " isn't a Generic type with one argument -- e.g. T<U>"); 
     } 
     return args[0]; 
    } 
Verwandte Themen