2010-09-30 2 views
0

Попытка получить заказ на IQueryable для работы, не имея большой удачи.Help with Generic LINQ OrderBy Lambda Expression

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

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

Как объявить об этом, так что я могу ЗаказатьBy любое имущество моего лица (Сообщение)?

Это LINQ-сущности (Entity Framework 4.0).

+0

Посмотрите на [этот ответ] [1] Приветствия [1]: http://stackoverflow.com/a/12920596/ 1139347 – joaopintocruz

ответ

3

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

так: а) что я могу изменить для моего объявления метода, и б) как изменить использование? – RPM1984

+0

@ RPM1984: Вам не нужно менять использование. –

+0

просто видел ваше редактирование, спасибо. – RPM1984

0

У вас должен быть хотя бы общий тип параметров, определенный для ключа заказа. Вместо возврата 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(); 
}