存储库中的异步 AsQueryable [重复]

Posted

技术标签:

【中文标题】存储库中的异步 AsQueryable [重复]【英文标题】:Async AsQueryable in repository [duplicate] 【发布时间】:2017-11-09 21:37:50 【问题描述】:

在我的存储库中,我有一个方法“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()”所以不好。

谁能解释一下如何正确地做到这一点。

【问题讨论】:

见:***.com/questions/26676563/… 【参考方案1】:

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

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

【讨论】:

以上是关于存储库中的异步 AsQueryable [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何转换 git 存储库中的大量提交 [重复]

如何撤消新初始化存储库中的提交(未推送)[重复]

如何将文件从一个文件夹移动到同一git存储库中的另一个文件夹保留历史记录[重复]

Node中并行/异步的多个分页GET API调用

Node中并行/异步的多个分页GET API调用

linq中AsEnumerable和AsQueryable的区别