2016-09-08 2 views
2

Je suis le tri sur plusieurs critères en utilisant le tri dynamique, voici mon code:Orderby ne fonctionne pas

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 
       { 

Ce que je suis en train de faire ici est que je veux la colonne OrderID soit le tri secondaire chaque fois qu'il est pas tri primaire, mais cela n'a pas fonctionné quand j'ai effectivement choisi une autre colonne comme un tri primaire. En d'autres termes, quand une autre colonne est sélectionnée comme tri primaire dans l'ordre décroissant, OrderID devrait également être dans l'ordre décroissant, je ne suis pas sûr de ce que j'ai manqué dans mon code. La méthode OrderBy que j'ai utilisée provient de here (MSDN).

+0

Pourquoi ne pas utiliser OrderBy() ThenBy() –

+0

@ShannonHolsinger Parce qu'il n'y a pas 'ThenBy()' en tri dynamique ... – Phantom

+0

Hahaha oui, vous avez raison. Ma faute. Se déplaçant le long .... –

Répondre

4

La méthode que vous utilisez a la signature suivante:

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

de sorte que le sortSecCol + " " + sortSecDir va à l'argument values, alors que la commande tout est censé être fourni comme séparés par des virgules liste dans l'argument ordering.

Vous pouvez utiliser quelque chose comme ceci:

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

Merci, cela fonctionne parfaitement. – Phantom

0

essayer.

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 
      {