2009-09-29 21 views
6

Próbuję posortować zestaw użytkowników. Mam dostęp do właściwości i kierunku sortowania (asc, desc). Moje bieżące zamówienie według zapytania znajduje się poniżej. Ale jak widać, nie uwzględnia to kierunku sortowania. W jaki sposób mogę zbudować to wyrażenie bez konieczności używania Dynamic Linq lub dodawania innego zestawu instrukcji dla kierunku sortowania "asc" lub "desc".Kierunek sortowania Linq z ciągu

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

Odpowiedz

12

Najlepiej, chcesz użyć OrderByDescending - możesz oczywiście oszukać:

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

OrderBy przejście w selektorze i bool?

Jeśli nie potrzebujesz statycznego pisania, możesz również budować wyrażenia dynamicznie od podstaw, oczywiście - jak np. this short sample (podobnie jak w dynamicznej bibliotece LINQ).

+0

Lepsza odpowiedź :) – Lazarus

+1

działa świetnie, dziękuję. Zmieniłem bool, aby użyć System.ComponentModel.ListSortDirection – zzz

+0

'IBindingList' /' IBindingListView', a następnie? –

2

Byłoby if myślę, żaden inny prosty sposób to zrobić, to znaczy:

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

Wystarczy popatrzeć na to jak dobrze: Sorting a list using Lambda/Linq to objects

0

Zobacz przykłady kodu CS. Istnieją dynamiczne przykłady Linq.

z próbek:

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

Sortuj według kodeksu:

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

Ale pamiętaj, aby sprawdzić wprowadzania danych przez użytkownika!