如何在使用实体框架4.1使用Where表达式查询上下文时包括所有子实体



我创建了一个通用存储库,用于处理实体查询。

当我称之为:

public IQueryable<TEntity> GetQuery()
        {
           return _context.Set<TEntity>().AsQueryable();
        }

我取回整个实体,包括所有子实体。

当我称之为:

public TEntity GetById(Guid id)
        {
            return GetQuery().Where(e => e.Id == id).FirstOrDefault();
        }

我必须指定要包含哪些子实体。

有没有一种方法可以在不必为每个实体写include的情况下取回所有子实体?

默认情况下,会启用延迟加载。这意味着当您访问集合时,集合将被加载,而不是当您检索父对象时,例如
foreach (var parent in repo.GetQuery()) {
    foreach (var child in parent.Children) {
        // do something
    }
}

如果您希望急切地加载实体,您可以将泛型存储库子类化,并覆盖您希望使用Include lambda的方法。或者,还有一个Include方法,它接受要包含的关联的字符串列表,您可以在通用存储库中公开该列表。

更新:

不太清楚你为什么给我答案——1,但作为进一步的澄清。

关于您的GetQuery()方法,您已说明:

我取回整个实体,包括所有子实体。

无论您是在调试中访问集合,还是在页面上输出集合,都会延迟加载子实体。

单个查询应该工作,并启用延迟加载。

而AFAIK,在禁用延迟加载的情况下,这并不意味着所有集合都会自动加载,恰恰相反,您必须通过调用Include来显式加载它们。

最新更新