2015-06-21 3 views
6

posso costruisco Linq Query dinamicamente con orderby dichiarazione come di seguito:Come aggiungere dinamicamente in ordine decrescente?

var Query = from q in Db.TblUsers select q; 

switch (Order) 
{ 
    case "Name": Query = from q in Query orderby q.Name select q; break; 
    case "DOB": Query = from q in Query orderby q.DOB select q; break; 
    // ... and more cases 
} 

var Result = Query.ToList(); 

Tuttavia, se v'è la necessità da ordinare decrescente (dipende dalla selezione dell'utente nell'interfaccia utente), dovrò costruire un altro switch duplica tutti i casi solo per aggiungere la parola chiave "discendente" dopo il orderby.

esempio:

if (ascending) 
{ 
    switch (Order) 
    { 
     case "Name": Query = from q in Query orderby q.Name select q; break; 
     // .... 
    } 
} 
else 
{ 
    switch (Order) 
    { 
     case "Name": Query = from q in Query orderby q.Name descending select q; break; 
     // .... 
    } 
} 

C'è un modo per me di aggiungere solo la parola chiave discendente dinamicamente alla query?

+3

http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet –

+0

Forse si può basta usare 'if (! ascending) {Query = Query.Reverse(); } '? Oppure puoi aspettare di avere il tuo 'Elenco <>' che può essere invertito sul posto: 'Result.Reverse();' –

risposta

2

Non è grande, ma non è che male:

var Query = Db.TblUsers.AsQueryable(); 

switch (Order) 
{ 
    case "Name": Query = ascending ? 
        Query.OrderBy(q=>q.Name) : 
        Query.OrderByDescending(q=>q.Name); 
     break; 
    case "DOB": Query = ascending ? 
        Query.OrderBy(q=>q.DOB) : 
        Query.OrderByDescending(q=>q.DOB); 
     break; 
    // ... and more cases 
} 

var Result = Query.ToList(); 

Vedi

+0

@xanatos: perché non aggiungere una risposta? Assicurati di includere tutto il codice, però. –

1

Data:

public static class OrderByEx 
{ 
    public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending) 
    { 
     if (ascending) 
     { 
      return source.OrderBy(keySelector); 
     } 

     return source.OrderByDescending(keySelector); 
    } 
} 

È possibile:

var Query = Db.TblUsers.AsQueryable(); 

switch (Order) 
{ 
    case "Name": 
     Query = Query.OrderBy(q=>q.Name, ascending); 
     break; 
    case "DOB": 
     Query = Query.OrderBy(q=>q.DOB, ascending); 
     break; 
    // ... and more cases 
} 
+0

Fresco, la migliore risposta finora! –