分享

linq 动态排序 order by

 ThinkTank_引擎 2017-06-26
项目查询数据库使用的是linq 语法,可是后期需要用到不同字段的排序。


各种纠结! 在网上找了各种资料 后面才找到两种方法

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Linq.Expressions;  
  5. using System.Reflection;  
  6. using System.Text;  
  7.   
  8.   
  9.   
  10.   
  11. namespace Rose.Repository.Repositories  
  12. {  
  13.     public static class DBHelper  
  14.     {  
  15.         public static IQueryable<T> DataSort<T>(IQueryable<T> source, string sortExpression, string sortDirection)  
  16.         {  
  17.             string sortingDir = string.Empty;  
  18.             if (sortDirection.ToUpper().Trim() == "ASC")  
  19.                 sortingDir = "OrderBy";  
  20.             else if (sortDirection.ToUpper().Trim() == "DESC")  
  21.                 sortingDir = "OrderByDescending";  
  22.             ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);  
  23.             PropertyInfo pi = typeof(T).GetProperty(sortExpression);  
  24.             Type[] types = new Type[2];  
  25.             types[0] = typeof(T);  
  26.             types[1] = pi.PropertyType;  
  27.             Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));  
  28.             IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);  
  29.             return query;  
  30.         }  
  31.         public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)  
  32.         {  
  33.             return source.Skip(pageNumber * pageSize).Take(pageSize);  
  34.         }  
  35.         public static IQueryable<T> Sorting<T>(IQueryable<T> source, string sortExpression, string sortDirection, int pageNumber, int pageSize)  
  36.         {  
  37.             IQueryable<T> query = DataSort<T>(source, sortExpression, sortDirection);  
  38.             return DataPaging(query, pageNumber, pageSize);  
  39.         }  
  40.     }  
  41. }  
  42.   
  43.   
  44. var list=from entity in db.Set<menu>()  select entity;  
  45. var str = DBHelper.DataSort(list, "menu_id", "desc");  



(2) System.Linq.Dynamic


开始我找了很久 System.Linq.Dynamic引用都没用,最后使用的是



在nuget 中searh System.Linq.Dynamic 安装对应的版本, 这样都可以使用了

[csharp] view plain copy
  1. var orderExpression = string.Format("{0} {1}", sortName, sortType); //sortName排序的名称 sortType排序类型 (desc asc)  
  2. return list.OrderBy(orderExpression).Skip(pageIndex).Take(pageSize).ToList();  

个人觉得使用System.Linq.Dynamic更加方便


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多