存储库

时间:2017-11-09 21:37:51

标签: c# asynchronous repository-pattern asqueryable

在我的存储库中,我有一个方法“AllMakesAsync”,它从数据库中检索车辆品牌:

public async Task<IEnumerable<VehicleMake>> AllMakesAsync()
    {
        return await _context.VehicleMakes.ToListAsync();
    }

在存储库中我还有“GetVehicleMakesWithPaginationAsync”方法,其中使用了“AllMakesAsync”方法:

  public async Task<IEnumerable<VehicleMake>> GetVehicleMakesWithPaginationAsync(string search, int? page, string sort)
    {
        var makes = await AllMakesAsync();

        switch (sort)
        {
            case "Name desc":
                makes = makes.OrderByDescending(x => x.Name);
                break;
            default:
                makes = makes.OrderBy(x => x.Name);
                break;
        }

        if (search == null)
        {
            return makes.ToList().ToPagedList(page ?? 1, 5);
        }

        return makes.Where(x => x.Name.StartsWith(search, StringComparison.OrdinalIgnoreCase)).ToList().ToPagedList(page ?? 1, 5);
    }

有人告诉我,如果我要在数据集上使用过滤,我不应该使用“ToListAsync()”而应该使用“AsQueryable”。

问题在于我不知道如何异步实现“AsQueryable”。

我可以像这样返回“AsQueryable”:

    public async Task<IQueryable<VehicleMake>> AllMakesAsync()
    {
        var vehicleMakes = await _context.VehicleMakes.AsQueryable().ToListAsync();
        return vehicleMakes.AsQueryable();
    }

但是我在这里再次使用“ToListAsync()”因此它不好。

有人可以解释一下如何正确地做到这一点。

1 个答案:

答案 0 :(得分:0)

您正在执行查询,然后在您已经完成执行并获得结果后,您会尝试定义查询应该是什么,应该包含哪些项目,订单是什么等等你不需要这样做。您需要确定您的查询是什么(确定应该有哪些过滤器,排序,页面大小等),然后然后通过调用ToListAsync来执行您的查询。

尝试执行查询,返回结果,但是然后尝试假装那些已经返回的结果实际上是一个尚未执行的查询并没有真正做任何事情以确保您之前定义查询你执行它。