gpt4 book ai didi

c# - LINQ:动态地对许多列进行排序

转载 作者:行者123 更新时间:2023-11-30 18:08:18 25 4
gpt4 key购买 nike

我有一个 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 是我的简单枚举,有 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.

非常直观

最佳答案

您只需要检查查询是否已经订购:

private IQueryable<T> ApplySorting<T,U>(IQueryable<T> query, Expression<Func<T, U>> predicate, SortOrder order)
{
var ordered = query as IOrderedQueryable<T>;
if (order == SortOrder.Ascending)
{
if (ordered != null)
return ordered.ThenBy(predicate);
return query.OrderBy(predicate);
}
else
{
if (ordered != null)
return ordered.ThenByDescending(predicate);
return query.OrderByDescending(predicate);
}
}

关于c# - LINQ:动态地对许多列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com