2009-10-07 6 views
2

Essayer quelque chose avec Linq/Lambda, mais ne savez pas où chercher.Expressions linq/lambda

Je travaille sur un tri simple dans un ASP.net GridView. Voici quelques exemples de code:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

if (isAscending) 
{ 
    switch (e.SortExpression) 
    { 
     case "Name": 
      query.OrderBy(c => c.Name); 
      break; 
     default: 
      break; 
    } 
} 
else 
{ 
    switch (e.SortExpression) 
    { 
     case "Name": 
      query.OrderByDescending(c => c.Name); 
      break; 
     default: 
      break; 
    } 
} 

grid.DataSource = query.ToList(); 
grid.DataBind(); 

Je suis cependant pas satisfait du code tel qu'il est très sensible aux erreurs et nécessite beaucoup de code dupliqués. J'espère résoudre cela en utilisant des expressions lambda à la place, mais je n'ai aucune idée de comment. Voici ce que je voudrais aller à:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

var param = null; 

switch (e.SortExpression) 
{ 
    case "Name": 
     param = (c => c.Name); 
     break; 
    default: 
     break; 
} 

if (isAscending) 
{ 
    query.OrderBy(param); 
} 
else 
{ 
    query.OrderByDescending(param); 
} 

grid.DataSource = query.ToList(); 
grid.DataBind(); 

Quelqu'un peut-il s'il vous plaît aidez-moi? Merci!

Répondre

4

Votre code est cassé pour le moment - vous appelez OrderBy/OrderByDescending mais n'utilisez pas le résultat. Vous avez besoin

query = query.OrderBy(param); 

etc.

En ce qui concerne la commande conditionnelle - le problème est que vous ne pouvez pas déclarer le type de param parce que le type de la clé de commande peut bien varier en fonction de l'expression de tri.

Pour contourner ce problème, vous pouvez écrire votre propre méthode d'extension:

public static IOrderedQueryable<TSource> OrderByWithDirection<TSource, TKey> 
    (this IQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.OrderBy(keySelector) 
        : source.OrderByDescending(keySelector); 
} 

Votre code deviendrait alors:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

switch (e.SortExpression) 
{ 
    case "Name": 
     query = query.OrderByWithDirection(c => c.Name, isAscending); 
     break; 
    // etc 
    default: 
     break; 
} 

(Pourquoi appelez-vous AsQueryable, par la voie?)

+0

Comme toujours, une réponse gret, merci! – StevenMcD

+0

Merci pour la réponse. Le code ci-dessus a été fait à partir de morceaux de code réel, donc j'ai peut-être fait quelques erreurs. C'était plus pour l'image quand même. En ce qui concerne votre réponse: merci! C'est en effet une très bonne solution. Je le prends comme je le voulais n'est pas possible? –