【发布时间】:2010-07-23 15:34:20
【问题描述】:
我有一个 IQueryable 查询并希望对其动态应用排序,排序可以在许多列上(asc 或 desc)。我编写了以下通用函数:
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 是我的简单枚举,有 2 个值:升序和降序
然后我循环调用这个函数,为用户请求排序的每一列。但是我注意到它失败了,因为它总是按使用的最后一列排序,而忽略其他列。
然后我发现 IOrderedQueryable 上有一个“ThenBy”方法,所以有效的用法是:
var q = db.MyType.OrderBy(x=>x.Col1).ThenBy(y=>y.Col2); //etc.
但是我怎样才能使它通用呢?我试图测试查询是否为 IOrderedQueryable 但它似乎总是正确的,即使它是最简单的 var q = from x in db.MyType select x
我不知道为什么要这样设计。有什么问题:
var q = db.MyType.OrderBy(x=>x.Col1).OrderBy(y=>y.Col2); //etc.
非常直观
【问题讨论】:
-
我认为他们不让 .OrderBy(..Col1..).OrderBy(..Col2..) 飞是因为他们不是知道预期最终结果是否的好方法是按 Col1 排序,然后按 Col2 重新排序整个列表;或 Col1 然后是 Col2 的子排序(如您所愿)
-
查询执行被延迟,当您编写 .OrderBy 时,在您第一次遍历查询集之前什么都不会发生。
标签: c# linq linq-to-entities