Есть задача отобразить… ну для примера товары в разделе интернет магазина.
Используется LINQ to SQL.
Пишу примерно такой код:
List lstGoods = DataContext.Sections.Where(x=>x.id = iMySectionId).First().Goods.Take(iPageSize).ToList();
Проблема в том, что товары нужно упорядочивать. Код преобразовывается:
List lstGoods = DataContext.Sections.Where(x=>x.id = iMySectionId).First().Goods.OrderBy(x=>x.Name).Take(iPageSize).ToList();
Но ведь пользователь может выбрать сортировку по одному из нескольких полей, и в любом направлении.
Получаем примерно такое:
Первый вариант
List lstGoods = null;
if(sSortField == «name»)
{
if(sSortDirection == «ASC»)
{
lstGoods = DataContext.Sections.Where(x=>x.id = iMySectionId).First().Goods.OrderBy(x=>x.Name).Take(iPageSize).ToList();
}
else
{
lstGoods = DataContext.Sections.Where(x=>x.id = iMySectionId).First().Goods.OrderByDescending(x=>x.Name).Take(iPageSize).ToList();
}
}
И такое для всех полей. Ужас же! Столько запросов отличающихся только одним параметром. А если полей для сортировки пятнадцать а запрос занимает десять строк? Это же невозможно поддерживать.
Второй вариант
List lstGoods = DataContext.Sections.Where(x=>x.id = iMySectionId).First().Goods.ToList();
if(sSortField == «name»)
{
if(sSortDirection == «ASC»)
{
lstGoods = lstGoods .OrderBy(x=>x.Name).Take(iPageSize);
}
else
{
lstGoods = lstGoods .OrderByDescending(x=>x.Name).Take(iPageSize);
}
}
Уже хорошо. Но на сколько я понимаю работу LINQ to SQL, первый запрос (тот что перед первым if), будет скомпилирован в один SQL запрос, выполнен, потом мне вернется List из Good (причем из всех лежащих в этой секции, мы не можем выбрать первые iPageSize товаров, т.к. не известен их порядок), потом уже внутри программы весь этот List будет отсортирован и от него взяты первые iPageSize элементов. Получается разбазаривание вычислительной мощности на сортировку внутри кода. Это SQL сервер сделает лучше и быстрее. И не надо товары не вошедшие на текущую страницу пересылать.
Как правильно решить мою проблему не прибегая к DataContext.ExecuteQuery?