7

मैं सभी डीबीसेट्स के List कैसे प्राप्त कर सकता हूं जहां निहित प्रकार IncomingServiceOrderBase से प्राप्त होता है?मैं उन सभी डीबीसेट्स को कैसे ढूंढ सकता हूं जिनके जेनेरिक प्रकार किसी दिए गए बेस प्रकार से प्राप्त होते हैं?

मैं सभी डीबीसेट प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकता हूं, लेकिन मैं इसे व्युत्पन्न प्रकार वाले लोगों को कैसे फ़िल्टर करूं?

प्रसंग

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; 

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

T में DbSet<T> चालू करने के लिए (ताकि आप इस तुलना कर सकते हैं) प्रत्येक संपत्ति के प्रकार लेने के लिए और कुछ इस तरह कर देखें (यह गुणों के नाम लौटाता है; यदि आप वास्तविक डीबीसेट उदाहरण चाहते हैं, p.GetValue(context, null) के साथ प्रतिस्थापित करें)

2

typeof(BaseType).IsAssignableFrom(DerivedType)। यह सच/गलत वापस आ जाएगा।

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]; 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे