如何获取在实体框架中实现接口的导航属性列表

时间:2017-09-11 13:15:23

标签: entity-framework reflection interface

在实体框架中,我有一个主类,其中包含2个子类的ICollection定义。

 public partial class Class1{
      public virtual ICollection<Class2> Class2 {get;set;}
      public virtual ICollection<Class3> Class3 {get;set;}
 }

 public partial class Class2 : ITotal {
      public double Total {get;}
 }

 public partial class Class3 {

 }

Class2实现了ITotal接口...... Class3没有。

总共Class1有大约30个ICollections实例,其中基础对象实现ITotal接口。它还有10多个ICollections没有实现接口。

在Class1中,我需要能够动态获取其基类型实现ITotal接口的所有ICollections。然后我将添加“总计”字段以获得总计。我需要它是动态的原因是因为我将向class1添加更多的ICollections,我不想/需要记住去多个地方以使总数准确。

下面是我到目前为止的一个示例...这段代码给了我所有的ICollection类,但现在我被卡住了。理想情况下,我可以在最后一次选择之后添加另一个where子句,但我愿意完全废弃它。

 var value1 = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
                          .Where(x => x.CanWrite && x.GetGetMethod().IsVirtual)
                          .Select(x => x.GetValue(this, null))
                          .Where(x => x != null)
                          .Where(x => x.GetType().GetInterfaces().Any(y => y.IsGenericType && y.GetGenericTypeDefinition() == typeof(ICollection<>)))
                          .Select(x=> ((IEnumerable)x))
                          .ToList()
                          ;

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

像这样:

        var c = new Class1();

        //. . .

        var q = from p in typeof(Class1).GetProperties()
                where p.PropertyType.IsConstructedGenericType
                   && p.PropertyType.GetGenericTypeDefinition().Equals(typeof(ICollection<>))
                   && typeof(ITotal).IsAssignableFrom(p.PropertyType.GetGenericArguments()[0])
                select p;

        var ITotalCollections = q.ToList();

        var q2 = from p in ITotalCollections
                 from i in (IEnumerable<ITotal>)p.GetValue(c)
                 select i.Total;

        var total = q2.Sum();