7

Jak uzyskać List ze wszystkich DbSetów, w których zawarty typ pochodzi od IncomingServiceOrderBase?Jak mogę znaleźć wszystkie DbSety, których typy generyczne pochodzą z danego typu podstawowego?

Mogę użyć odbicia, aby uzyskać wszystkie DbSety, ale jak mogę je przefiltrować do tych, które zawierają typ pochodny?

Kontekst

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

model

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

Odpowiedz

18

Można zrobić somehing tak:

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; 

(to zwraca nazwy właściwości, jeśli chcesz rzeczywiste wystąpienia DbSet, zastąp p.Name z p.GetValue(context, null))

2

typeof(BaseType).IsAssignableFrom(DerivedType). Zwróci true/false. Zobacz http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

Aby włączyć DbSet<T> do T (więc można zrobić to porównanie) podejmuje rodzaj poszczególnych właściwości i zrobić coś takiego:

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]; 
    } 
Powiązane problemy