Как включить сортировку в PagedList <T> - PullRequest
0 голосов
/ 28 ноября 2009

Я надеюсь, что кто-то использовал очень хороший PagedList от Troy Goode ? Я на самом деле использую его в приложении Winforms, и пока он работает, я потерял способность сортировать его.

Возврат PagedList, управление страницей и размером, а также привязка к DataGridView не проблема, но моя самая большая проблема - сортировка. Теперь я также натолкнулся на SortedPageList от Мухаммеда Моза , но я действительно запутался с одним из требований к параметрам. Я использую закрытый метод для возврата SortedPageList, но мой код ниже, похоже, не работает:

private SortedPagedList<Location, Location> GetInactiveLocationData(int Index, int Size) {
    sysDataContext ctx = new sysDataContext();
    try {
        var query = ctx.Location.Where(x => x.Active == false).AsQueryable();
        return query.ToPagedList(Index, Size, i => i, false);          
        //return new SortedPagedList<Location, Location>(query, Index, Size, i => i , true);
    }
    catch (Exception) {
        throw;
    }
}

Это выдает ошибку "Cannot order by type: Location". Очевидно, я бы хотел обработать случай, когда пользователь щелкает заголовок столбца для сортировки по этому столбцу.

Я знаю, что решение включает в себя лямбда-выражения выше уровня знаний, которые у меня есть (как бы стыдно это ни было), и я совершенно не понимаю этого! Буду очень признателен за ваши советы по поводу вышесказанного!

Спасибо тебе!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2009

ОК, я чувствую себя идиотом! ... ну, немного! Я получил следующее на работу:

using (sysContext ctx = new sysDataContext()) {
    try {
        var data = ctx.Location.Where(x => x.Active == false).AsQueryable();
        var query = data.ToPagedList(PageIndex, PageSize, o => o.DueDate, true);
        dgv.DataSource = query;
    }
    catch (Exception) {
        throw;
    }
}

Теперь выражение сортировки описывается здесь как o => o.DueDate. Это здорово, и хотя это работает, я пытаюсь найти способ создать универсальную функцию, которая позволит мне:

  1. Определить, по какому заголовку столбца щелкнули (возможно, с помощью оператора switch)
  2. Преобразуйте его тип в соответствующее свойство Linq Entity
  3. Передайте это свойство в универсальный метод

Метод, который выглядит примерно так:

private void RefreshData([type] SortExpression, bool Ascending, int PageIndex, int PageSize) {
    using (sysDataContext ctx = new sysDataContext()) {
        try {
            var data = ctx.Location.AsQueryable();
            var query = data.ToPagedList(PageIndex, PageSize, o => o.[SortExpression], Ascending);
            dgv.DataSource = query;
        }
        catch (Exception) {
            throw;
        }
    }
}

Возможно ли это?

Еще одна вещь (если она поможет вам мне помочь), метод SortedPageList выглядит так:

public static SortedPagedList<T, TResult> ToPagedList<T, TResult>(this IQueryable<T> source, int index, int pageSize, System.Linq.Expressions.Expression<Func<T, TResult>> keySelector, bool asc) {
    return new SortedPagedList<T, TResult>(source, index, pageSize, keySelector, asc);
}

Как мне выразить System.Linq.Expressions.Expression<Func<T, TResult>> как тип, который можно передать в качестве параметра?

0 голосов
/ 28 ноября 2009

Ну, вы можете начать с изучения базовых операций LINQ (прокрутите вниз до части "упорядочивание". Или здесь: LINQ Часть 1 - Фильтрация и сортировка списков объектов .

Как только вы откроете магию, вы полетите: P

...