Linq / лямбда-выражения - PullRequest
2 голосов
/ 07 октября 2009

Пробую что-то с Linq / Lambda, но не знаю, где искать.

Я работаю над простой сортировкой в ​​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();

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

1 Ответ

4 голосов
/ 07 октября 2009

В данный момент ваш код не работает - вы вызываете 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?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...