PagedList.Mvc, Entity Framework i długie ładowanie tabeli

0

Witam, zaprzęgłem do pracy na mojej stronce, 2 framework-i z tematu. Stworzyłem Encje która jest widokiem w bazie SQL, używam PagedList do stronicowania, wyszukiwania i filtrowania zawartości i niestety jest to trochę mało efektywne. Mianowicie, strona z listą pobieraną z sql, ładuje mi się koło 10 sek, każde przejscie na kolejną stronę około 5 sek, filtrowanie, wyszukiwanie około 15 sek.

Jest to bardzo mało efektywne i chciałbym móc to jakoś zoptymalizować, aczkolwiek nie wiem jak ponieważ tych frameworków używam po raz pierwszy. Poniżej przedstawiam kontroler.

  public class OrdersListController : Controller
    {
        private readonly cbaEntities _db = new cbaEntities();
        private const int pageSize = 25;

        //
        // GET: /OrdersList/

        public ActionResult OrdersList(int? page, string sortOrder, string searchString, string currentFilter, string searchByDistributor, string searchByStatus, string searchByForm, string searchByFormat, string searchByContentServer)
        {
          
            //podstawowe query 
            var ordersList = from s in _db.zamowienia_lista select s;

            // metoda służąca do generowania dropDownList 
            SetCollectionForFilter(ordersList);


            if (searchString != null)
            {
                page = 1;
            }
            else
            {
                searchString = currentFilter;
            }

            int pageNumber = (page ?? 1);

            ViewBag.CurrentFilter = searchString;

            //generuje listę zamówień na podstawie uzupełnionych filtrów
            ordersList = CheckAndRetrieveOrdersSearchAndFilters(searchString, ordersList, searchByDistributor, searchByStatus, searchByForm, searchByFormat, searchByContentServer);

            //domyślne sortowanie
            AddSortingOnPage(sortOrder);

            //metoda służąca do sortowania listy po zadanych kolumnach
            ordersList = SpecifyChoiceSorting(sortOrder, ordersList);

            return View(ordersList.ToPagedList(pageNumber, pageSize));
        }

        private void SetCollectionForFilter(IQueryable<zamowienia_lista> ordersList)
        {
            var distributors = ordersList.Select(d => d.dystrybutor_id).Distinct();

            ViewBag.SearchByDistributor = new SelectList(distributors);

            var status = ordersList.Select(d => d.status_zamowienia).Distinct();

            ViewBag.SearchByStatus = new SelectList(status);

            var form = ordersList.Select(d => d.forma).Distinct();

            ViewBag.SearchByForm = new SelectList(form);

            var format = ordersList.Select(d => d.format).Distinct();

            ViewBag.SearchByFormat = new SelectList(format);

            var contentServer = ordersList.Select(d => d.cs_id).Distinct();

            ViewBag.SearchByContentServer = new SelectList(contentServer);
        }

        private IQueryable<zamowienia_lista> CheckAndRetrieveOrdersSearchAndFilters(string searchString, IQueryable<zamowienia_lista> ordersList, string searchByDistributor, string searchByStatus, string searchByForm, string searchByFormat, string searchByContentServer)
        {
            if (!String.IsNullOrEmpty(searchString))
            {
                ordersList = ordersList.Where(s =>
                s.zamowienie_id.Contains(searchString) ||
                s.cs_order_id.Contains(searchString) ||
                s.zamowienie_zewnetrzne_id.Contains(searchString) ||
                s.komentarz.Contains(searchString)
                );
            }

            ViewBag.DistributorParam = searchByDistributor;
            ViewBag.StatusParam = searchByStatus;
            ViewBag.FormParam = searchByForm;
            ViewBag.FormatParam = searchByFormat;
            ViewBag.ContentServerParam = searchByContentServer;


            if (!string.IsNullOrEmpty(searchByDistributor))
            {
                ordersList = ordersList.Where(s => s.dystrybutor_id == searchByDistributor);
            }

            if (!string.IsNullOrEmpty(searchByStatus))
            {
                ordersList = ordersList.Where(s => s.status_zamowienia == searchByStatus);
            }

            if (!string.IsNullOrEmpty(searchByForm))
            {
                ordersList = ordersList.Where(s => s.forma == searchByForm);
            }

            if (!string.IsNullOrEmpty(searchByFormat))
            {
                ordersList = ordersList.Where(s => s.format == searchByFormat);
            }

            if (!string.IsNullOrEmpty(searchByContentServer))
            {
                ordersList = ordersList.Where(s => s.cs_id == searchByContentServer);
            }

            return ordersList;
        }

        private static IQueryable<zamowienia_lista> SpecifyChoiceSorting(string sortOrder, IQueryable<zamowienia_lista> orders)
        {
            switch (sortOrder)
            {
                case "distributor":
                    orders = orders.OrderBy(s => s.dystrybutor_id);
                    break;
                case "order":
                    orders = orders.OrderByDescending(s => s.zamowienie_id);
                    break;
                case "externalOrder":
                    orders = orders.OrderByDescending(s => s.zamowienie_zewnetrzne_id);
                    break;
                case "status":
                    orders = orders.OrderByDescending(s => s.status_zamowienia);
                    break;
                case "form":
                    orders = orders.OrderByDescending(s => s.forma);
                    break;
                case "format":
                    orders = orders.OrderByDescending(s => s.format);
                    break;
                case "cs":
                    orders = orders.OrderByDescending(s => s.cs_id);
                    break;
                case "comment":
                    orders = orders.OrderBy(s => s.komentarz);
                    break;
                case "add":
                    orders = orders.OrderBy(s => s.dodano);
                    break;
                case "add_desc":
                    orders = orders.OrderByDescending(s => s.dodano);
                    break;
                default:
                    orders = orders.OrderByDescending(s => s.dodano);
                    break;
            }

            return orders;
        }

        private void AddSortingOnPage(string sortOrder)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.DistributorSortParam = String.IsNullOrEmpty(sortOrder) ? "distributor" : "";
            ViewBag.OrderSortParam = String.IsNullOrEmpty(sortOrder) ? "order" : "";
            ViewBag.ExternalOrderSortParam = String.IsNullOrEmpty(sortOrder) ? "externalOrder" : "";
            ViewBag.StatusSortParam = String.IsNullOrEmpty(sortOrder) ? "status" : "";
            ViewBag.FormSortParam = String.IsNullOrEmpty(sortOrder) ? "form" : "";
            ViewBag.FormatSortParam = String.IsNullOrEmpty(sortOrder) ? "format" : "";
            ViewBag.CsSortParam = String.IsNullOrEmpty(sortOrder) ? "cs" : "";
            ViewBag.CommentSortParam = String.IsNullOrEmpty(sortOrder) ? "comment" : "";
            ViewBag.AddedSortParam = sortOrder == "add" ? "add_desc" : "add";
        }

        protected override void Dispose(bool disposing)
        {
            _db.Dispose();
            base.Dispose(disposing);
        }
    }

Według mnie problem może tkwić w tym ze za każdym razem wykonuje query z całej tabeli (czy to otwarcie strony, czy przejścia na drugą stronę), czyli :

  //podstawowe query 
            var ordersList = from s in _db.zamowienia_lista select s;

Bardzo proszę o pomoc w optymalizacji działania. Pozdrawiam

0

I pewno masz rację. Natychmiast przestań tak robić, i problem się rozwiąże. Sugeruję też nie mieszać notacji językowej i metodowej LINQ, a raczej trzymać się tej drugiej, bo generalnie jest łatwiejsza i lepiej wygląda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1