在Linq中动态排序依据 [英] Dynamic Order By in Linq

查看:51
本文介绍了在Linq中动态排序依据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an app that accesses database and has to order results by different fields depending on the input.

这是我的排序功能:

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;      
}

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

There are some problems with this code that I don't like:

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

选择* FROM data_table订购案例@OrderBy当"id"然后"id"时当编码"然后编码
当活跃"然后活跃ELSE名称
结尾;

SELECT * FROM data_table ORDER BY CASE @OrderBy WHEN 'id' THEN id WHEN 'code' THEN code
WHEN 'active' THEN active ELSE name
END ;

转换为列表并返回以进行反转.我无法更改返回类型,并且我绝对不想编写更多无用的代码(使用 OrderByDescending 实质上将 switch switch case 加倍).

Conversion to list and back for reversing. I can not change return type and I definitely do not want to write even more useless code (essentially doubling switch case with OrderByDescending).

有人可以建议使此功能更好看的方法,最好还是使用 LINQ 吗?

Can anyone suggest ways of making this function better-looking, preferably still using LINQ?

推荐答案

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

Well, you definitely want to use OrderByDescending instead of reversing. It's not going to be quite as brief as the SQL, but you could at least use:

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);
   }
}

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

You could remove that repetition with your own extension method:

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);
   }
}

这篇关于在Linq中动态排序依据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆