Как передать массив выражений OrderBy в метод? - PullRequest
7 голосов
/ 19 февраля 2011

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

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

Вот мой код хранилища:

public virtual IList<TEntity> SelectOrderedList(
    Expression<Func<TEntity, bool>>[] Orderers,
    bool Ascending = true) {
    IOrderedQueryable<TEntity> TemporaryQueryable = null;

    foreach (Expression<Func<TEntity, bool>> Orderer in Orderers) {
        if (TemporaryQueryable == null) {
            TemporaryQueryable = (Ascending ? this.ObjectSet.OrderBy(Orderer) : this.ObjectSet.OrderByDescending(Orderer));
        } else {
            TemporaryQueryable = (Ascending ? TemporaryQueryable.ThenBy(Orderer) : TemporaryQueryable.ThenByDescending(Orderer));
        };
    };

    return TemporaryQueryable.ToList();
}

Кстати, я не уверен на 100%, что должен использовать Expression<Func<TEntity, bool>>. По какой-то причине у меня такое ощущение, что это должно быть Expression<Func<TEntity, int>>, но я не слишком уверен.

В любом случае, я был бы очень признателен, если бы кто-нибудь показал мне, как на самом деле это назвать. Бонусные баллы и любовь, если вы можете заставить это работать как аргумент params.

1 Ответ

7 голосов
/ 08 марта 2011
public virtual IList<TEntity> SelectOrderedList(
    params Expression<Func<TEntity, IComparable>>[] Orderers) {
    IOrderedQueryable<TEntity> TemporaryQueryable = null;

    foreach (Expression<Func<TEntity, IComparable>> Orderer in Orderers) {
        if (TemporaryQueryable == null) {
            TemporaryQueryable = this.ObjectSet.OrderBy(Orderer);
        } else {
            TemporaryQueryable = TemporaryQueryable.ThenBy(Orderer);
        };
    };

    return TemporaryQueryable.ToList();
}

Затем просто используйте его как SelectOrderedList(o1 => (o1.Something), o2 => (o2.SomethingElse)) ...

Кроме того, напишите другое для Descending:)

Если вы хотите, чтобы каждый заказчик мог подниматься или опускатьсязамените подпись на Tuple>, SortDirection>, но вы не можете использовать лямбда-выражения с неявным типом с неявно типизированными кортежами (и вы не можете использовать их с неявными выражениями), так что тогда у вас будет довольно уродливый код при его использовании ...

...