2010-09-30 116 views
0

試圖讓IQueryable上的OrderBy工作,沒有太多的運氣。通用LINQ幫助OrderBy Lambda表達式

這裏是我的方法:

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

我該如何聲明所以我可以OrderBy 任何我的實體(郵政)的財產?

這是LINQ實體(實體框架4.0)。

+0

看看[這個答案] [1] 乾杯 [1]:http://stackoverflow.com/a/12920596/ 1139347 – joaopintocruz 2012-10-16 18:02:37

回答

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

所以a)我如何更改我的方法聲明,以及b)如何更改用法? – RPM1984 2010-09-30 07:25:38

+0

@ RPM1984:您不必更改使用情況。 – 2010-09-30 07:26:34

+0

剛剛看到您的編輯,謝謝。 – RPM1984 2010-09-30 07:26:53

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(); 
}