我有一个采用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/