मैं एएसपीनेट कोर वेब ऐप में अपने पेजिनेशन को बेहतर बनाने की कोशिश कर रहा हूं ... मैं प्रत्येक पेज पर केवल 10 रिकॉर्ड लोड करना चाहता हूं। पहली बार मैंने ऐसा किया, मैं सभी रिकॉर्ड लोड कर रहा था, और फिर अंत में मैं उनमें से केवल 10 प्राप्त कर रहा था और दृश्य को भेज रहा था, बहुत बुरा क्योंकि मुझे दो बार डेटा मिल रहा है और पहली बार मुझे सभी रिकॉर्ड मिल रहे हैं ... (नीचे उदाहरण) मेरा दृष्टिकोण अब वास्तव में केवल 10 आइटम प्राप्त कर रहा है .. लेकिन इससे पहले मैं उन सभी को गिनता हूं ताकि मेरे पास कुल पृष्ठों की संख्या हो सके ... (नीचे उदाहरण)

पेजिनेशन के बिना एक और दृश्य में मुझे 13 रिकॉर्ड पसंद हैं और मुझे वे सभी मिलते हैं, इसमें मैं 100-300 एमएस कम या ज्यादा लेता हूं ... तो मेरा मुद्दा यहां सेकंड दृष्टिकोण के साथ है, मेरा समय लगभग 2,60 क्यों है सेकंड? क्या यह अधिकतम 1 सेकंड की तरह नहीं होना चाहिए? साथ ही, पहले और सेकंड के दृष्टिकोण के बीच का अंतर न्यूनतम है, और मेरे पास टेबल पर 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);

अब मुझे केवल १० मिलते हैं, मुझे लगता है, फिर तेजी से आगे क्यों नहीं बढ़ रहा है? किसी भी मदद की सराहना की जाती है

3
Ricardo Figueiredo 16 अक्टूबर 2020, 13:04

1 उत्तर

सबसे बढ़िया उत्तर

मेरा अनुमान आपके डेटाबेस, पंक्ति गणना, आपके सिस्टम विनिर्देशों और आपके बाकी कार्यान्वयन को जाने बिना, 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));
                
2
Athanasios Kataras 16 अक्टूबर 2020, 10:42