开发者

Help With Generic LINQ OrderBy Lambda Expression

开发者 https://www.devze.com 2023-01-18 08:48 出处:网络
Trying to get an OrderBy on an IQueryable to work, not having much luck. Here\'s my method: public ICollection<T> FindAll<T>(Expression<Func<T,bool>> predicate, Expression<

Trying to get an OrderBy on an IQueryable to work, not having much luck.

Here's my method:

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)
             .ToPage开发者_StackOverflowdList();
}

The ordering works if i do this:

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

But not if i want to do this:

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

It doesn't work of course, because i have declared the Expression as T,int, whereas the above expression is of type T,DateTime

How do i declare it so i can OrderBy any property of my entity (Post)?

This is LINQ-Entities (Entity Framework 4.0).


Queryable.OrderBy takes a key selector with the following type:

Expression<Func<TSource, TKey> keySelector>

If you change orderingKey to an expression of this type then it will work. You will also need to add another type parameter.

public ICollection<T> FindAll<T, TKey>(
    Expression<Func<T, bool>> predicate,
    Expression<Func<T, TKey>> orderingKey
) where T : Post


You would have to at least have a generic parameter type defined for the ordering key. Instead of returning int, return a generic type.

e.g.,

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

精彩评论

暂无评论...
验证码 换一张
取 消