gpt4 book ai didi

c# - Linq 中的动态排序依据

转载 作者:太空狗 更新时间:2023-10-29 22:15:31 24 4
gpt4 key购买 nike

我有一个访问数据库的应用程序,必须根据输入按不同字段对结果进行排序。

这是我的排序函数:

IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLower())
{
case "id":
result = result.OrderBy(c => c.Id);
break;

case "code":
result = result.OrderBy(c => c.Code);
break;

case "active":
result = result.OrderBy(c => c.Active);
break;

default:
result = result.OrderBy(c => c.Name);
break;
}

if (pageData.SortDesc)
{
var res = result.ToList();
res.Reverse();
return res.AsQueryable();
}

return result;
}

这段代码有一些我不喜欢的问题:

  1. 重复代码太多。如果它是“纯 SQL”查询,它看起来像

    从数据表中选择 * 订购方式 案例@OrderBy 当'id'然后id 当'代码'然后代码
    当“活跃”时 THEN 活跃 其他名称
    结尾;

  2. 转换为列表并返回以进行逆向。我无法更改返回类型,我绝对不想编写更多无用的代码(本质上是 switch caseOrderByDescending 的两倍)。

任何人都可以建议使这个函数更好看的方法,最好仍然使用 LINQ

最佳答案

好吧,您肯定想要使用OrderByDescending 而不是反转。它不会像 SQL 那样简短,但您至少可以使用:

IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLowerInvariant())
{
case "id":
return desc ? result.OrderByDescending(c => c.Id) : result.OrderBy(c => c.Id);
case "code":
return desc ? result.OrderByDescending(c => c.Code) : result.OrderBy(c => c.Code);
case "active":
return desc ? result.OrderByDescending(c => c.Active) : result.OrderBy(c => c.Active);
default:
return desc ? result.OrderByDescending(c => c.Name) : result.OrderBy(c => c.Name);
}
}

您可以使用自己的扩展方法删除重复:

public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
bool descending) =>
descending ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);

然后写:

IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLowerInvariant())
{
case "id": return result.OrderBy(c => c.Id, desc);
case "code": return result.OrderBy(c => c.Code, desc);
case "active": return result.OrderBy(c => c.Active, desc);
default: return result.OrderBy(c => c.Name, desc);
}
}

关于c# - Linq 中的动态排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45761350/

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