2015-06-21 11 views
6

mogę skonstruować Linq Query dynamicznie orderby oświadczenie jak poniżej:Jak dynamicznie dodawać malejąco do orderby?

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(); 

Jednakże, jeśli istnieje potrzeba, aby być uporządkowane malejąco (w zależności od wyboru użytkownika w interfejsie), będę musiał zbudować kolejny switch duplikować wszystkie sprawy, aby dodać słowo kluczowe "malejąco" po zamówieniu.

przykład:

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; 
     // .... 
    } 
} 

Czy istnieje sposób dla mnie, aby dodać tylko słowa kluczowego dynamicznie opadający do zapytania?

+3

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

+0

Może ty po prostu użyj 'if (! ascending) {Query = Query.Reverse(); } '? Można też poczekać, aż pojawi się "Lista <>", która może być odwrócona w miejscu: 'Result.Reverse();' –

Odpowiedz

2

To nie jest wielki, ale to nie że złe:

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(); 

Zobacz

+0

@xanatos: dlaczego nie dodać odpowiedzi jako odpowiedzi? Pamiętaj jednak, aby uwzględnić cały kod. –

1

Dane:

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); 
    } 
} 

Można:

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

Fajna, najlepsza odpowiedź do tej pory! –

Powiązane problemy