2009-10-07 3 views
2

Пытается что-то с Linq/Lambda, но понятия не имеет, где искать.Linq/лямбда-выражения

Я работаю над простой сортировкой в ​​ASP.net GridView. Вот некоторые примеры кода:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

if (isAscending) 
{ 
    switch (e.SortExpression) 
    { 
     case "Name": 
      query.OrderBy(c => c.Name); 
      break; 
     default: 
      break; 
    } 
} 
else 
{ 
    switch (e.SortExpression) 
    { 
     case "Name": 
      query.OrderByDescending(c => c.Name); 
      break; 
     default: 
      break; 
    } 
} 

grid.DataSource = query.ToList(); 
grid.DataBind(); 

Я, однако, неудовлетворенный с кодом, как он очень чувствителен к ошибкам и требует много дублированного кода. Я надеюсь решить это, используя выражения Лямбда, но я понятия не имею, как это сделать. Вот что я хотел бы посетить:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

var param = null; 

switch (e.SortExpression) 
{ 
    case "Name": 
     param = (c => c.Name); 
     break; 
    default: 
     break; 
} 

if (isAscending) 
{ 
    query.OrderBy(param); 
} 
else 
{ 
    query.OrderByDescending(param); 
} 

grid.DataSource = query.ToList(); 
grid.DataBind(); 

Может ли кто-нибудь мне помочь? Спасибо!

ответ

4

Ваш код сейчас не работает - вы вызываете OrderBy/OrderByDescending, но не используете результат. Вам нужно

query = query.OrderBy(param); 

и т.д.

Что касается условно заказа - проблема в том, что вы не можете объявить тип param, так как тип ключа заказа может также варьироваться в зависимости от выражения сортировки.

В качестве обходного пути, вы можете написать свой собственный метод расширения:

public static IOrderedQueryable<TSource> OrderByWithDirection<TSource, TKey> 
    (this IQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.OrderBy(keySelector) 
        : source.OrderByDescending(keySelector); 
} 

Ваш код будет затем стать:

IQueryable<User> query = (from c in users select c).AsQueryable<User>(); 

switch (e.SortExpression) 
{ 
    case "Name": 
     query = query.OrderByWithDirection(c => c.Name, isAscending); 
     break; 
    // etc 
    default: 
     break; 
} 

(Почему ты звонишь AsQueryable, кстати?)

+0

Как всегда, gret ответ, спасибо! – StevenMcD

+0

Спасибо за ответ. Код выше был сделан из кусков реального кода, поэтому я мог бы совершить некоторые ошибки. В любом случае, это было больше. Что касается вашего ответа: спасибо! Это действительно очень приятное решение. Я принимаю это так, как я хотел, это невозможно? – 2009-10-07 10:38:20