2016-09-08 4 views
2

я сортировка по нескольким критериям с использованием динамической сортировки, вот мой код:OrderBy не работает

public ActionResult WebGrid(int page = 1, int rowsPerPage = 10, string sortCol = "OrderID", string sortDir = "ASC", string sortSecCol = "OrderID", string sortSecDir = "ASC") 
    { 
     List<Orders> res; 

     using (var nwd = new NorthwindEntities()) 
     { 
      var _res = nwd.Orders 
       .AsQueryable() 
       .OrderBy(sortCol + " " + sortDir, sortSecCol + " " + sortSecDir) 
       .Skip((page - 1) * rowsPerPage) 
       .Take(rowsPerPage) 
       .Select(o => new Orders 
       { 

То, что я пытаюсь сделать здесь, я хочу столбец OrderID быть вторичной сортировки, когда она не является первичный сорт, но это не сработало, когда я фактически выбрал другой столбец как основной вид.

Для слов, когда другой столбец выбирается в качестве основного сортировки в порядке убывания, OrderID также должен быть в порядке убывания, я не уверен, что я пропустил в своем коде.

OrderBy способ, который я использовал, исходит от here (MSDN).

+0

Почему бы не использовать OrderBy() ThenBy() –

+0

@ShannonHolsinger Поскольку нет 'ThenBy()' в динамической сортировке ... – Phantom

+0

Ха-ха-ха, да, вы правы. Виноват. Двигаясь вместе ... –

ответ

4

метод вы используете имеет следующую подпись:

public static IQueryable<T> OrderBy<T>(
    this IQueryable<T> source, 
    string ordering, 
    params object[] values 
) 

так sortSecCol + " " + sortSecDir идет к values аргумента, в то время как весь заказ должен быть предусмотрен как список разделенных запятой в ordering аргумента.

Вы можете использовать что-то вроде этого, вместо:

var ordering = sortCol + " " + sortDir; 
if (sortSecCol != sortCol) 
    ordering += ", " + sortSecCol + " " + sortSecDir; 
... 
    .OrderBy(ordering) 
... 
+0

Спасибо, он отлично работает. – Phantom

0

попробовать это:.

if (sortCol == "OrderID" && sortDir == "ASC") 
    { 
     _res = l.OrderBy(x => x.OrderId).ThenBy(x => x.AnotherField); 
    } 
    if (sortCol == "OrderID" && sortDir == "DESC") 
    { 
     _res = l.OrderByDescending(x => x.OrderId).ThenByDescending(x => x.AnotherField); 
    } 
    if (sortCol == "AnotherField" && sortDir == "ASC") 
    { 
     _res = l.OrderBy(x => x.AnotherField).ThenBy(x => x.OrderId); 
    } 
    if (sortCol == "AnotherField" && sortDir == "DESC") 
    { 
     _res = l.OrderByDescending(x => x.AnotherField).ThenByDescending(x => x.OrderId); 
    } 

    _res.Skip((page - 1) * rowsPerPage) 
      .Take(rowsPerPage) 
      .Select(o => new Orders 
      { 
Смежные вопросы