【问题标题】:Generic repository with eager load using ThenInclude() method?使用 ThenInclude() 方法急切加载的通用存储库?
【发布时间】:2018-03-10 12:35:12
【问题描述】:

这是我的通用存储库:

public class Repository<T> : IRepository<T> where T : BaseEntity
{
    private DbContext _dbContext { get; set; }
    private DbSet<T> _dbSet { get; set; }

    public Repository(DbContext context)
    {
        this._dbContext = context;
        this._dbSet = context.Set<T>();
    }

    public IQueryable<T> GetAll(params Expression<Func<T, object>>[] includes)
    {
        IQueryable<T> currentSet = this._dbSet;
        foreach (var item in includes)
        {
            currentSet = currentSet.Include(item);
        }
        return currentSet;
    }

    public T Get(Expression<Func<T, bool>> predicated, 
        params Expression<Func<T, object>>[] includes) 
        => this.GetAll(includes).Where(predicated).FirstOrDefault();
}

问题是当我使用急切加载来加载问题(包括它的答案)时,我无法查询答案投票。

我确信我收到了这个错误,因为我正在加载一个问题,包括它的答案并再次包括答案的投票。所以我尝试使用 ThenInclude() 来解决这个问题,但我不知道如何在通用存储库中应用它。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 首先问自己一个问题,您是否真的需要这个存储库层。通常它只会造成麻烦。当您删除它们并直接使用 DbSet 时,您真的会丢失任何东西吗?
  • 我将存储库实现添加到我的项目的主要原因是使用依赖注入并使我的代码更具可测试性。
  • 是否值得强加的限制?无论如何,也许this 会有所帮助。
  • @GertArnold 我也在使用通用存储库,原因与 OP 相同。您能否提供一些链接以了解您在之前的评论中所说的内容?

标签: c# asp.net entity-framework eager-loading


【解决方案1】:

您可以使用嵌套包含来解决您的问题。 参考链接:EF LINQ include multiple and nested entities

【讨论】:

  • 这是一个仅链接的答案,当链接断开时它就没有用了。此外,您指的是一个 EF6 解决方案,它在 OP 正在使用的 EF-core 中绝对不起作用。我想知道它为什么被接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多