我有一个IQueryable的查询,想要动态地对其进行排序,可以根据许多列进行排序(升序或降序)。我编写了以下通用函数:
private IQueryable<T> ApplySorting<T,U>(IQueryable<T> query, Expression<Func<T, U>> predicate, SortOrder order)
{
if (order == SortOrder.Ascending)
{
{
return query.OrderBy<T, U>(predicate);
}
}
else
{
{
return query.OrderByDescending<T, U>(predicate);
}
}
}
SortOrder是我简单的枚举,有两个值:升序和降序。
然后我在循环中调用此函数,针对用户请求排序的每一列。 但是我注意到它失败了,因为它总是按照最后使用的列进行排序,忽略了其他列。
然后我发现IOrderedQueryable接口上有一个'ThenBy'方法,有效的用法是:
var q = db.MyType.OrderBy(x=>x.Col1).ThenBy(y=>y.Col2); //etc.
但是我该如何使它通用呢?我尝试测试查询是否为IOrderedQueryable,但似乎始终为true,即使它是最简单的var q = from x in db.MyType select x
我不知道为什么要设计成这样。以下代码有什么问题:
var q = db.MyType.OrderBy(x=>x.Col1).OrderBy(y=>y.Col2); //etc.
这非常直观。