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