是否可以从存储库返回 IQueryable?

问题描述 投票:0回答:1

我有一个 WebAPI 应用程序。我使用 Repository 模式,其中 GetAll 方法返回 IQueryable 集合来过滤数据库端的数据。正确吗?

这是界面:

public interface IBaseRepository<TEntity>
{
    IQueryable<TEntity> GetAll();

    Task<TEntity> CreateAsync(TEntity entity);

    Task<TEntity> UpdateAsync(TEntity entity);

    Task<TEntity> DeleteAsync(TEntity entity);
}

这是实现:

public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class
{
    private readonly ApplicationDbContext _dbContext;

    public BaseRepository(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task<TEntity> CreateAsync(TEntity entity)
    {
        if (entity == null)
            throw new ArgumentException("Entity is null");

        await _dbContext.AddAsync(entity);
        await _dbContext.SaveChangesAsync();

        return entity;
    }

    public async Task<TEntity> DeleteAsync(TEntity entity)
    {
        if (entity == null)
            throw new ArgumentException("Entity is null");

        _dbContext.Remove(entity);
        await _dbContext.SaveChangesAsync();

        return entity;
    }

    public IQueryable<TEntity> GetAll()
    {
        return _dbContext.Set<TEntity>();
    }

    public async Task<TEntity> UpdateAsync(TEntity entity)
    {
        if (entity == null)
            throw new ArgumentException("Entity is null");

        _dbContext.Update(entity);
        await _dbContext.SaveChangesAsync();

        return entity;
    }
}

这允许我进行数据库端过滤:

reports = await _reportRepository.GetAll()
        .Where(x => x.UserId == userId)
        .ToArrayAsync();

这种方法的正确性如何?我最近听说您需要从存储库返回 IEnumerable。

c# asp.net-core asp.net-web-api repository-pattern
1个回答
0
投票

我想说这要看情况,因为大多数开发人员都在这个问题上争论。让我向您概述一下从存储库层公开 IQueryable 意味着什么。

  • 灵活性:在公开 IQueryable 的同时,提供了对上层查询的控制。
  • 为了简单起见,可以用于不需要处理和管理多个层的小型项目。 (或者也直接使用 DbContext)。

另一方面

  • 首先,存储库模式应该抽象数据访问,并且通过公开 IQueryable 我相信您将失去主要目的。您可以简单地使用 DbContext 来代替。
  • 可以泄漏存储库的实现细节,同时向上层公开查询使得更改数据访问层变得更加困难,这可能需要对上层进行一些更改。
  • 在公开查询时编写测试会更加困难,您将不知道要测试什么查询。你会涵盖所有这些吗?
© www.soinside.com 2019 - 2024. All rights reserved.