【问题标题】:How to eagerly load all referenced entities dynamically in Entity Framework如何在实体框架中动态加载所有引用的实体
【发布时间】:2014-10-18 22:43:59
【问题描述】:
  • EF 6
  • 我有以下 POCO 的

_

public class StructureEntity : EmEntityBase
{
    [ForeignKey("ParentStructureId")]
    public virtual StructureEntity ParentStructure { get; set; }

    public long? ParentStructureId { get; set; }

    [ForeignKey("SiteId")]
    public virtual SiteEntity Site { get; set; }

    [Required(ErrorMessage = "Required.")]
    public long SiteId { get; set; }

    [Required(ErrorMessage = "Required.")]
    public string Name { get; set; }
}

public class SiteEntity : EmEntityBase
{
    [ForeignKey("ParentSiteId")]
    public virtual SiteEntity ParentSite { get; set; }

    public long? ParentSiteId { get; set; }

    [Required(ErrorMessage = "Required.")]
    public long ClientId { get; set; }

    [ForeignKey("ClientId")]
    public ClientEntity Client { get; set; }

    [Required(ErrorMessage = "Required.")]
    public string Name { get; set; }
}

public class ClientEntity : EmEntityBase
{
    public long? ParentClientId { get; set; }

    [ForeignKey("ParentClientId")]
    public virtual ClientEntity ParentClient { get; set; }

    public string Name { get; set; }
}

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

    public IQueryable<StructureDivisionEntity> GetAllWithInclude()
   {
   return GetAll()
         .Include(e => e.Structure)
         .Include(e => e.ParentStructureDivision.Structure)
         .Include(e => e.Structure.Site.Client);
   }

我想知道是否有一种动态方法可以做到这一点,而无需明确地执行 .Include(Structure) 等。类似于以下内容:

MyEntity.IncludeAllReferenced() 其中 IncludeAllReferenced 使用反射或类似方法来遍历 MyEntity 并执行所有包含?

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

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

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

示例,(如有必要,可以使用工厂模式扩展它):

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() 调用。
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多