0

在我的存储库中,我有一个从数据库中检索车辆制造的方法“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()”,所以不好。

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

4

1 回答 1

3

你正在执行你的查询,然后在你已经完成执行它并取回结果之后,你然后尝试定义查询应该是什么,其中应该包含哪些项目,什么顺序等。你不需要去做。您需要确定您的查询是什么(确定应该有哪些过滤器、什么排序、页面大小等),然后通过调用ToListAsync.

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

于 2017-11-09T21:42:10.487 回答