2010-01-06 9 views
5

J'utilise Linq to sql et Linq Dynamic OrderBy.Linq To Sql - Dynamic OrderBy - Cas Lorsque

Je sais dynamique LINQ peut faire le tri simple comme - orderby ("nom_colonne").

Mais supporte-t-il quelque chose de plus complexe comme des requêtes avec "CASE WHEN" dedans?

string orderbyQuery = "(CASE WHEN (username == 100) THEN 1 ELSE 0 END) DESC)"; 

Voici ma requête:

var u = from u in db.users 
     orderby(orderbyQuery) 
     select u; 

l'exemple ci-dessus ne fonctionne pas! , une idée si c'est possible? toute autre façon de le faire?

grâce

Répondre

10
var u = from u in db.users 
     orderby u.username == 100 ? 1 : 0 descending 
     select u; 
+0

je dois utiliser la requête dynamique parce que, j'ai un int [] realUsers = 100, 22, 77, 12, etc ... je veux trier la table des utilisateurs en fonction de ce int [], ce qui signifie montrer les utilisateurs dans "realUsers" d'abord. – dan

+1

Vous pouvez remplacer cette u.username == 100? 1: 0 avec (presque) n'importe quelle logique que vous voulez commander, vous êtes essentiellement en train de l'écrire en C# au lieu de Sql. Sans savoir exactement comment vous essayez de commander, il est difficile de donner un meilleur exemple que de convertir votre code original ... –

1

Cela fonctionne vraiment pour moi:

var queryResult = 
    from o in Source 
    orderby (o.ColumnThatSaysOrderByColumn1 ? o.Column1 : o.Column2) descending 
    select o 

Hope this helps!

0

Il semble que vous ne pouvez pas utiliser CASE dans une requête LINQ dynamique. Mais vous pouvez utiliser le iif-keyword:

var query = db.users.OrderByDescending("iif(username = '100', 1, 0)"); 

Overview des méthodes d'expression LINQ dynamiques et mots-clés.