Помощь с общим LINQ OrderBy лямбда-выражением - PullRequest
0 голосов
/ 30 сентября 2010

Попытка получить OrderBy на IQueryable для работы, без особой удачи.

Вот мой метод:

public ICollection<T> FindAll<T>(Expression<Func<T,bool>> predicate, Expression<Func<T,int>> orderingKey) where T : Post
{
    return repository
             .Find()
             .Where(predicate)
             .OfType<T>()
             .OrderBy(orderingKey)
             .ToPagedList();
}

Заказ работает, если я сделаю это:

FindAll(p => p.PostName == "Foo", p => p.PostId);

Но нет, если я хочу сделать это:

FindAll(p => p.PostName == "Foo", p => p.DateModified);

Конечно, это не работает, потому что я объявил выражение как T,int, тогда как вышеприведенное выражение имеет тип T,DateTime

Как мне это объявить, чтобы я мог заказать любое свойство моей сущности (Post)?

Это LINQ-Entities (Entity Framework 4.0).

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

Queryable.OrderBy использует ключевой селектор следующего типа:

Expression<Func<TSource, TKey> keySelector>

Если вы измените orderingKey на выражение этого типа, тогда он будет работать,Вам также нужно будет добавить другой параметр типа.

public ICollection<T> FindAll<T, TKey>(
    Expression<Func<T, bool>> predicate,
    Expression<Func<T, TKey>> orderingKey
) where T : Post
0 голосов
/ 30 сентября 2010

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

например,

public ICollection<TPost> FindAll<TPost,TOrder>(Expression<Func<TPost,bool>> predicate, Expression<Func<TPost,TOrder>> orderingKey) where TPost : Post
{
    return repository
             .Find()
             .Where(predicate)
             .OfType<TPost>()
             .OrderBy(orderingKey)
             .ToPagedList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...