Entity Framework - 加载带有子实体的实体

3
我正在尝试的是一次性加载数据库中所有 A 实体以及其对应的 B 实体。它们之间的关系是每个 A 实体都有一个对应的 B 实体。
我所在的项目采用仓储模式,并具有以下 All() 方法。
    public class EFRepository<T> : IRepository<T> where T : class, IObjectWithChangeTracker
        {
private IObjectSet<T> objectset;

        private IObjectSet<T> ObjectSet
        {
            get
            {
                if (objectset == null)
                {
                    objectset = UnitOfWork.Context.GetObjectSet<T>();
                }
                return objectset;
            }
        }
    public virtual IQueryable<T> All()
            {
                return ObjectSet.AsQueryable();
            }
    }

有没有办法强制加载B实体。我发现从All()方法返回的IQueryable上没有Include方法。我很乐意为存储库添加新成员,以允许客户使用贪婪加载。但是我该怎么做呢?

2个回答

4
问题在于 不知道它的支撑物是什么,而 是一个Entity Framework功能。你可以有一个使用LINQ to Objects 的,在这里没有意义。最简单的方法就是将 的类型更改为,从中你应该可以访问到 扩展方法。
如果您无法更改 的返回类型,则必须以这样的方式构建查询,以便它们迅速地拉入子元素。
IList<Parent> parentsWithEagerLoadedChildren = parentRepo.All()
    .Select(p => new {p, p.Children}).ToList() // EF will attach the children to each parent
    .Select(p => p.p).ToList(); // Now that everything is loaded, select just the parents

谢谢你的示例,它起作用了。我很高兴地报告说,它只发送了一个查询来获取所有实体A及其B,这超出了我的预期。 - Otake
关于IObjectSet,我无法访问include方法。然后我看到了这个链接https://dev59.com/-XE85IYBdhLWcg3w2HNa,这可能是更好的解决方法。 - Otake

1

您可以创建自己的扩展方法,使您能够针对任何 IQueryable<T> 使用 Include(path)

public static IQueryable<TSource> Include<TSource>
  (this IQueryable<TSource> source, string path)
{
  var objectQuery = source as ObjectQuery<TSource>;
  if (objectQuery != null)
  {
    return objectQuery.Include(path);
  }
  return source;
}

Julie Lerman的博客上有完整的解释:http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接