C# 如何在实体框架中动态加载所有引用的实体 环境足迹6 我有以下的POCO

C# 如何在实体框架中动态加载所有引用的实体 环境足迹6 我有以下的POCO,c#,entity-framework,C#,Entity Framework,_ 现在,当我想要急切地加载所有引用的实体时。为此,我必须: public IQueryable<StructureDivisionEntity> GetAllWithInclude() { return GetAll() .Include(e => e.Structure) .Include(e => e.ParentStructureDivision.Structure) .Include(e

_

现在,当我想要急切地加载所有引用的实体时。为此,我必须:

    public IQueryable<StructureDivisionEntity> GetAllWithInclude()
   {
   return GetAll()
         .Include(e => e.Structure)
         .Include(e => e.ParentStructureDivision.Structure)
         .Include(e => e.Structure.Site.Client);
   }
我想知道是否有一种动态的方法可以做到这一点,而不必显式地执行.IncludeStructure等操作,大致如下:

MyEntity.IncludealReferenced其中IncludealReferenced使用反射或类似来遍历MyEntity并执行所有包含操作

更新:查询复杂图的替代方法


您不能这样做,但是您可以使用extensionmethod来获取所有。 这可能是一个疯狂的想法,但您可以创建一个通用扩展方法来处理所有类型,从而使代码更加干净

例如,如有必要,可以使用factory模式对此进行扩展:

public static IQueryable<T> IncludeAll<T>(this IQueryable<T> query)
{
   if (typeof(T) == typeof(StructureDivisionEntity))
   {
       return GetAllWithInclude(query);
   }
   throw new NotImplementedException("IncludeAll not implemented for type {0}",typeof(T).FullName);
}

private static IQueryable<StructureDivisionEntity> GetAllWithInclude<StructureDivisionEntity> (IQueryable<StructureDivisionEntity> query) 
{
   return query.Include(e => e.Structure)
               .Include(e => e.ParentStructureDivision.Structure)
               .Include(e => e.Structure.Site.Client);
}

看,这是一个有趣的想法。遗憾的是,我仍然需要硬编码我想做的Include调用。
public static IQueryable<T> IncludeAll<T>(this IQueryable<T> query)
{
   if (typeof(T) == typeof(StructureDivisionEntity))
   {
       return GetAllWithInclude(query);
   }
   throw new NotImplementedException("IncludeAll not implemented for type {0}",typeof(T).FullName);
}

private static IQueryable<StructureDivisionEntity> GetAllWithInclude<StructureDivisionEntity> (IQueryable<StructureDivisionEntity> query) 
{
   return query.Include(e => e.Structure)
               .Include(e => e.ParentStructureDivision.Structure)
               .Include(e => e.Structure.Site.Client);
}