c# - 不可调用的成员“IUnitOfWork.AdminMerchants”不能像方法一样使用

在我的 ASP.NET Core 6 Web API 项目中,我正在实现 Repository 和 UnitOfWork:

我有这个代码:

IMerchantRepository:

public interface IAdminMerchantRepository : IGenericRepository<Merchant>
{
    IQueryable<AllMerchantListDto> GetAllMerchantAsync(PagingFilter filter);
}

商户仓库:

public class AdminMerchantRepository : GenericRepository<Merchant>, IAdminMerchantRepository
{
    private readonly ApplicationDbContext _dbContext;
    private readonly DbSet<Merchant> _adminMerchants;
    public AdminMerchantRepository(ApplicationDbContext dbContext) : base(dbContext)
    {
        _dbContext = dbContext;
        _adminMerchants = _dbContext.Set<Merchant>();
    }
    public IQueryable<AllMerchantListDto> GetAllMerchantAsync(PagingFilter filter)
    {
        var merchants = _dbContext.Merchants
                        .Where(x => string.IsNullOrEmpty(filter.SearchQuery) || x.User.UserName.ToLower().Contains(filter.SearchQuery.ToLower())
                    || x.User.Email.ToLower().Contains(filter.SearchQuery.ToLower())
                    || x.User.FirstName.ToLower().Contains(filter.SearchQuery.ToLower())
                    || x.User.LastName.ToLower().Contains(filter.SearchQuery.ToLower())
                    || x.MerchantName.ToLower().Contains(filter.SearchQuery.ToLower()))
                        .Include(x => x.User)
                        .OrderByDescending(x => x.CreatedAt);
        return (IQueryable<AllMerchantListDto>)merchants;
    }
}

工作单位:

public interface IUnitOfWork : IDisposable
{
    IAdminMerchantRepository AdminMerchants { get; }
    Task Save();
}

工作单位:

public class UnitOfWork : IUnitOfWork
{
    private readonly ApplicationDbContext _dbContext;
    private IAdminMerchantRepository _adminMerchants;

    public UnitOfWork(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    public IAdminMerchantRepository AdminMerchants => _adminMerchants ??= new AdminMerchantRepository(_dbContext);
    public async Task Save()
    {
        await _dbContext.SaveChangesAsync();
    }

    public void Dispose()
    {
        _dbContext.Dispose();
        GC.SuppressFinalize(this);
    }
}

我收到了这个错误:

不可调用的成员“IUnitOfWork.AdminMerchants”不能像方法一样使用

然后这个 AdminMerchants 突出显示在:

var 商人 = await _unitOfWork.AdminMerchants(filter);

回答1

看起来您正在呼叫

var merchant = await _unitOfWork.AdminMerchants(filter);

,而您的本意是呼叫

var merchant = await _unitOfWork.AdminMerchants.GetAllMerchantAsync(filter);

回答2

  1. GetAllMerchantAsync 不是异步方法。您需要调用 await _unitOfWork.AdminMerchants.GetAllMerchantAsync(filter).ToListAsync() 并更好地将方法重命名为 GetAllMerchant

  2. 您的查询将失败,因为您生成的不是 IQueryable<AllMerchantListDto> 而是 IQueryable<Merchant>。这就是为什么您应用了错误的显式强制转换。

它应该是:

return merchants.Select(m => new AllMerchantListDto
{
   ... // assign properties
});
  1. 如果不需要,不要创建额外的抽象。 DbContext 已经是 Unit Of Work 并且 DbSet 已经是存储库。 GetAllMerchant 可以只是扩展方法,不需要额外的抽象。