我有一个采用IQueryable<T>的方法,并且我想在其中通用实现OrderBy。理想情况下,通过将c => c.SomeProperty作为参数传入,但是我不知道如何使泛型起作用,因此我尝试了使用字符串。但是我得到了错误:

Incorrect number of parameters supplied for lambda declaration


这就是我尝试过的(使用字符串方法)

var sortSelectorParameter = Expression.Parameter(typeof(T), "c");
var sortSelector = Expression.PropertyOrField(sortSelectorParameter, "ClientId"); // ClientId is the property string

collection = collection.OrderByDescending(Expression.Lambda<Func<T, bool>>(sortSelector));


我很困惑,因为OrderBy仅采用一个参数-有什么建议吗?

最佳答案

您需要将参数传递给Expression::Lambda<T>,因为错误表明:

var sortSelectorParameter = Expression.Parameter(typeof(T), "c");
var sortSelector = Expression.PropertyOrField(sortSelectorParameter, "ClientId"); // ClientId is the property string

collection = collection.OrderByDescending(Expression.Lambda<Func<T, bool>>(sortSelector, sortSelectorParameter ));


您的lambda的“ body”是指参数c,由ExpressionParameter实例sortSelectorParameter表示。您需要将此参数实例传递给lambda,以便它知道主体引用的参数实际上是您要创建的lambda的参数内。

编辑:上面的内容可能会回答您的技术问题,但目前尚不清楚您要在这里实现什么。如果您只想按编译时知道的顺序进行排序,则不需要任何这些。包装OrderByDescending方法有什么意义?

IQueryable<TElement> MySpecialOrderBy<TElement, TKey>(IQueryable<TElement> source, Expression<Func<TElement, TKey>> keySelector)
{
    return source.OrderByDescending(keySelector);
}

关于c# - 难以实现通用的OrderBy解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43369061/

10-13 00:53