7

如何獲得所有DbSet的List,其中包含的類型來自IncomingServiceOrderBase如何找到所有DbSets的泛型類型都是從給定的基類型派生的?

我可以使用反射來獲取所有的DbSets,但是如何將它過濾到只包含派生類型的那些?

語境

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

型號

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

回答

18

你可以做somehing這樣的:

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; 

(這將返回屬性的名稱;如果您想要實際的DbSet實例,請用p.GetValue(context, null)替換p.Name

2

typeof(BaseType).IsAssignableFrom(DerivedType)。它會返回true/false。見http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

要打開DbSet<T>T(所以你可以做這樣的比較)採取每個屬性的類型和做這樣的事情:

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]; 
    } 
相關問題