gpt4 book ai didi

c# - Asp.net 核心问题中的分页,只得到 10 个项目不能让它更快?

转载 作者:行者123 更新时间:2023-12-04 15:15:33 25 4
gpt4 key购买 nike

我正在尝试改进我在 Asp.net 核心 Web 应用程序中的分页...我只想每页加载 10 条记录。我第一次这样做时,我正在加载所有记录,然后最后我只得到其中的 10 个并发送到 View ,非常糟糕,因为我两次获取数据并且我第一次获取所有记录...... (下面的例子)我现在的方法实际上只获取 10 个项目..但在此之前我将它们全部计算在内以便我可以获得总页数...(下面的示例)

在另一个没有分页的 View 中,我有大约 13 条记录,我得到了所有记录,因为我或多或少需要 100-300 毫秒......所以我的意思是,使用秒方法,为什么我的时间大约是 2.60 秒?不应该是最多 1 秒吗?此外,第一种方法和第二种方法之间的区别是最小的,我在 table 上有 8000 多条记录......我做错了什么?这次如何改进?

我的第一种方法代码:

ViewModelCentroCusto vmcc = new ViewModelCentroCusto()
{
CurrentPage = page,
FirstPageShow = Math.Max(2, page - NUMBER_OF_PAGES_BEFORE_AND_AFTER),
Departamentos = selectListdepartamentos,
Empresas = selectListEmpresas,
Anos = selectListAnos.GroupBy(x => x.Text).Select(x => x.First()).OrderBy(o => o.Text).ToList()
};

//atualizacao do viewModel com base em filtros, pesquisas e paginacoess
if (!String.IsNullOrEmpty(searchString))
{

vmcc.CentroCustos = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Where(p => p.CentroCusto.Contains(searchString) || p.Descricao.Contains(searchString));

}
else {


vmcc.CentroCustos = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true);

}

vmcc.TotalPages = (int)Math.Ceiling((decimal)vmcc.CentroCustos.Count() / NUMBER_OF_PRODUCTS_PER_PAGE);
vmcc.CentroCustos = vmcc.CentroCustos.Skip((page - 1) * NUMBER_OF_PRODUCTS_PER_PAGE);
vmcc.CentroCustos = vmcc.CentroCustos.Take(NUMBER_OF_PRODUCTS_PER_PAGE);
vmcc.LastPageShow = Math.Min(vmcc.TotalPages, page + NUMBER_OF_PAGES_BEFORE_AND_AFTER);
vmcc.FirstPage = 1;
vmcc.LastPage = vmcc.TotalPages;
vmcc.CurrentSearchString = searchString;
vmcc.DepartmentoSelecionado = departmentoSelecionado;
vmcc.AnoSelecionado = anoSelecionado;
vmcc.EmpresaSelecionada = empresaSelecionada;

return View(vmcc);

这是我获取所有记录的地方,然后我得到其中的 10 个,至少对我来说没有意义,所以我改为:

ViewModelCentroCusto vmcc = new ViewModelCentroCusto()
{
CurrentPage = page,
FirstPageShow = Math.Max(2, page - NUMBER_OF_PAGES_BEFORE_AND_AFTER),
Departamentos = selectListdepartamentos,
Empresas = selectListEmpresas,
Anos = selectListAnos.GroupBy(x => x.Text).Select(x => x.First()).OrderBy(o => o.Text).ToList()
};

//atualizacao do viewModel com base em filtros, pesquisas e paginacoess
if (!String.IsNullOrEmpty(searchString))
{
number = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Where(p => p.CentroCusto.Contains(searchString) || p.Descricao.Contains(searchString))
.Count();

vmcc.CentroCustos = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Where(p => p.CentroCusto.Contains(searchString) || p.Descricao.Contains(searchString))
.Skip((page - 1) * NUMBER_OF_PRODUCTS_PER_PAGE)
.Take(NUMBER_OF_PRODUCTS_PER_PAGE);
}
else {
number = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Count();

vmcc.CentroCustos = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Skip((page - 1) * NUMBER_OF_PRODUCTS_PER_PAGE)
.Take(NUMBER_OF_PRODUCTS_PER_PAGE);
}

vmcc.TotalPages = (int)Math.Ceiling(number / NUMBER_OF_PRODUCTS_PER_PAGE);
//vmcc.CentroCustos = vmcc.CentroCustos.Skip((page - 1) * NUMBER_OF_PRODUCTS_PER_PAGE);
//vmcc.CentroCustos = vmcc.CentroCustos.Take(NUMBER_OF_PRODUCTS_PER_PAGE);
vmcc.LastPageShow = Math.Min(vmcc.TotalPages, page + NUMBER_OF_PAGES_BEFORE_AND_AFTER);
vmcc.FirstPage = 1;
vmcc.LastPage = vmcc.TotalPages;
vmcc.CurrentSearchString = searchString;
vmcc.DepartmentoSelecionado = departmentoSelecionado;
vmcc.AnoSelecionado = anoSelecionado;
vmcc.EmpresaSelecionada = empresaSelecionada;

return View(vmcc);

我想现在我只得到 10 个,那为什么变得更快了呢?感谢任何帮助

最佳答案

在不知道您的数据库、行数、系统规范和其余实现的情况下,我的猜测是因为 Count

                number = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Where(p => p.CentroCusto.Contains(searchString) || p.Descricao.Contains(searchString))
.Count();

此查询需要评估并扫描所有数据库行以获得总数。这将花费与您原来花费的时间几乎相同的时间:

                vmcc.CentroCustos = _context.RH_CentroCusto
.Where(p => anoSelecionado.Any() ? anoSelecionado.Contains(p.Ano.ToString()) : true)
.Where(p => departmentoSelecionado.Any() ? departmentoSelecionado.Contains(p.Departamento.Departamento) : true)
.Where(p => empresaSelecionada.Any() ? empresaSelecionada.Contains(p.Empresa.Codigo) : true)
.Where(p => p.CentroCusto.Contains(searchString) || p.Descricao.Contains(searchString));

关于c# - Asp.net 核心问题中的分页,只得到 10 个项目不能让它更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64387054/

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