IQueryable_Sort_Extensions.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Runtime.CompilerServices;
  6. using Vit.Core.Util.ComponentModel.Query;
  7. using Vit.Linq.QueryBuilder;
  8. namespace Vit.Extensions.Linq_Extensions
  9. {
  10. public static partial class IQueryable_Sort_Extensions
  11. {
  12. #region Sort
  13. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  14. public static IQueryable IQueryable_Sort(this IQueryable source, IEnumerable<SortItem> sort)
  15. {
  16. if (sort == null || sort.Count() == 0) return source;
  17. #region GetSortMethodName
  18. bool isFirst = true;
  19. string GetSortMethodName(bool asc)
  20. {
  21. if (isFirst)
  22. {
  23. isFirst = false;
  24. return asc ? "OrderBy" : "OrderByDescending";
  25. }
  26. return asc ? "ThenBy" : "ThenByDescending";
  27. }
  28. #endregion
  29. var targetType = source.ElementType;
  30. ParameterExpression parameter = Expression.Parameter(targetType);
  31. Expression queryExpr = source.Expression;
  32. foreach (var item in sort)
  33. {
  34. // get memberExp
  35. Expression memberExp = LinqHelp.GetFieldMemberExpression(parameter, item.field);
  36. #region (x.2)Call
  37. queryExpr = Expression.Call(
  38. typeof(Queryable), GetSortMethodName(item.asc),
  39. new Type[] { source.ElementType, memberExp.Type },
  40. queryExpr, Expression.Quote(Expression.Lambda(memberExp, parameter)));
  41. #endregion
  42. }
  43. return source.Provider.CreateQuery(queryExpr);
  44. }
  45. #endregion
  46. /// <summary>
  47. ///
  48. /// </summary>
  49. /// <param name="query"></param>
  50. /// <param name="field"></param>
  51. /// <param name="asc"> whether sort by asc</param>
  52. /// <returns></returns>
  53. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  54. public static IQueryable IQueryable_Sort(this IQueryable query, string field, bool asc = true)
  55. {
  56. return query.IQueryable_Sort(new[] { new SortItem { field = field, asc = asc } });
  57. }
  58. }
  59. }