尝试让IQueryable上的OrderBy工作,没有太多运气。
这是我的方法:
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 我的实体的任何属性(Post)?
这是LINQ-Entities(实体框架4.0)。
答案 0 :(得分: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
答案 1 :(得分: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();
}