7

İçerdiği türün IncomingServiceOrderBase'dan türediği tüm DbSet'lerden List nasıl edinebilirim?Genel türleri belirli bir taban türünden türeyen tüm DbSet'leri nasıl bulabilirim?

Tüm DbSet'leri elde etmek için yansımayı kullanabilirim ama nasıl türetilmiş tür içerenleri filtreleyebilirim?

Bağlam

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

cevap

18

Böyle somehing yapabilirsiniz:

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; 

http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

T içine DbSet<T> açmak için (böylece bu karşılaştırmayı yapabilirsiniz) her özelliğin türünü alıp böyle bir şey yapmak Bkz (bu özellik adlarını döndürür; gerçek DbSet örneklerini istiyorsanız, p.Name'u p.GetValue(context, null) ile değiştirin)

2

typeof(BaseType).IsAssignableFrom(DerivedType). Doğru/yanlış döndürür.

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]; 
    } 
İlgili konular