2009-09-29 5 views
6

Ich versuche, eine Reihe von Benutzern zu sortieren. Ich habe Zugriff auf die Sortiereigenschaft und -richtung (asc, desc). Meine aktuelle Bestellung per Anfrage ist unten. Aber wie Sie sehen können, ist dies nicht für die Sortierrichtung verantwortlich. Wie kann ich diesen Ausdruck erstellen, ohne Dynamic Linq zu verwenden oder einen weiteren Satz von Anweisungen für die Sortierrichtung "asc" oder "desc" hinzuzufügen?Linq Sortierrichtung von String

public override IQueryable<DalLinq.User> GetSort(IQueryable<DalLinq.User> query) 
{ 
    //SelectArgs.SortDirection <- Sort Direction 
    switch (SelectArgs.SortProperty) 
    { 
     case "LastName": 
     query = query.OrderBy(p => p.LastName); 
     break; 
     case "FirstName": 
     query = query.OrderBy(p => p.FirstName); 
     break; 
     default: 
     query = query.OrderBy(p => p.UserName); 
     break; 
    } 

    return query; 
} 

Antwort

12

Idealerweise verfügen Sie wollen OrderByDescending verwenden - Sie natürlich Cheat konnte:

public static class MyExtensionMethods 
{ 
    public static IOrderedQueryable<TSource> OrderBy<TSource,TValue>(
     this IQueryable<TSource> source, 
     Expression<Func<TSource,TValue>> selector, 
     bool asc) 
    { 
     return asc ? source.OrderBy(selector) : source.OrderByDescending(selector); 
    } 
} 

und Verwendung OrderBy in den Selektor und ein bool?

Wenn Sie die statische Typisierung nicht benötigen, können Sie die Ausdrücke natürlich auch dynamisch von Grund auf aufbauen - wie this short sample (ähnlich der dynamischen LINQ-Bibliothek).

+0

Nicer Antwort :) – Lazarus

+1

funktioniert super, danke. Ich änderte das bool, um System.ComponentModel.ListSortDirection zu verwenden – zzz

+0

Eine 'IBindingList' /' IBindingListView', dann? –

2

Es wäre eine if-Anweisung Ich glaube, keine andere einfache Möglichkeit, es zu tun, das heißt:

query = (SelectArgs.SortDirection == "asc") ? query.OrderBy(p => p.LastName) 
      : query.OrderByDescending(p => p.LastName); 

Werfen Sie einen Blick auf diese auch: Sorting a list using Lambda/Linq to objects

0

Werfen Sie einen Blick auf die CS-Code-Beispiele. Es gibt eine dynamische Linq Beispiele.

Von den Proben:

Northwind db = new Northwind(connString); 
db.Log = Console.Out; 

var query = 
    db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). 
    OrderBy("CompanyName"). 
    Select("New(CompanyName as Name, Phone)"); 

Sortieren nach Code:

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

    public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (ordering == null) throw new ArgumentNullException("ordering"); 
     ParameterExpression[] parameters = new ParameterExpression[] { 
      Expression.Parameter(source.ElementType, "") }; 
     ExpressionParser parser = new ExpressionParser(parameters, ordering, values); 
     IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering(); 
     Expression queryExpr = source.Expression; 
     string methodAsc = "OrderBy"; 
     string methodDesc = "OrderByDescending"; 
     foreach (DynamicOrdering o in orderings) { 
      queryExpr = Expression.Call(
       typeof(Queryable), o.Ascending ? methodAsc : methodDesc, 
       new Type[] { source.ElementType, o.Selector.Type }, 
       queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters))); 
      methodAsc = "ThenBy"; 
      methodDesc = "ThenByDescending"; 
     } 
     return source.Provider.CreateQuery(queryExpr); 
    } 

aber sicher sein, dass Sie Benutzereingaben überprüfen!

Verwandte Themen