gpt4 book ai didi

c# - Entity Framework 异步记录计数与记录

转载 作者:太空狗 更新时间:2023-10-30 01:33:14 26 4
gpt4 key购买 nike

我正在尝试从数据库中获取记录,但在对数据库的同一次调用中获取记录计数。我的方法是异步的,所以我不确定这是否是正确的方法:

    public async Task<IEnumerable<ProductItemViewModel>> GetAsync(int pageIndex, int pageSize)
{
var products = this.Repository.GetAll<Product>().OrderBy(p => p.Price).AsQueryable();

var count = await products.CountAsync();
if (count == 0)
return new List<ProductItemViewModel>();

products = products.ToPaginatedList(pageIndex, pageSize);
var result = await products.ToListAsync();

var viewModels = new List<ProductItemViewModel>();
Mapper.Map(result, viewModels);

return viewModels.AsEnumerable();
}

我认为 await CountAsync() 不太好,但我不确定如何实现它。

问候。

编辑:

我为没有在任何地方返回计数而道歉,因为现在看来我只是因为那个 == 0 检查才计数,但我最终会返回带有记录的计数,因为我需要它用于我的角度分页指令。还没有弄清楚我将如何返回(新类与元组),所以我错过了它并专注于 Entity Framework Count() 和单个数据库调用中的实体获取。

最佳答案

我认为您的代码可以针对此进行优化:

using AutoMapper.QueryableExtensions;
//...
public async Task<IEnumerable<ProductItemViewModel>> GetAsync(int pageIndex, int pageSize)
{
var products = this.Repository.GetAll<Product>().OrderBy(p => p.Price);// I think you don't need to call AsQueryable(), you already are working with IQueryable
var result=await products.Skip(pageIndex*pageSize).Take(pageSize).ProjectTo<ProductItemViewModel>().ToListAsync();
return result;
}

最后只需一行即可完成:

public async Task<IEnumerable<ProductItemViewModel>> GetAsync(int pageIndex, int pageSize)
{

return await this.Repository.GetAll<Product>()
.OrderBy(p => p.Price)
.Skip(pageIndex*pageSize)
.Take(pageSize)
.ProjectTo<ProductItemViewModel>()
.ToListAsync();
}

.ProjectTo<ProductItemViewModel>()将告诉 AutoMapper 的映射引擎向 IQueryable 发出一个选择子句这将通知 Entity Framework 它只需要查询您映射的属性,就像您手动投影 IQueryable 一样到ProductItemViewModelSelect条款。

关于c# - Entity Framework 异步记录计数与记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com