帮助通用LINQ OrderBy Lambda表达式

时间:2010-09-30 07:21:02

标签: c# linq linq-to-entities sql-order-by expression

尝试让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)。

2 个答案:

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