IQueryableExtensions.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. namespace InABox.Core
  5. {
  6. internal class ParameterReplacer : ExpressionVisitor
  7. {
  8. private readonly ParameterExpression _parameter;
  9. internal ParameterReplacer(ParameterExpression parameter)
  10. {
  11. _parameter = parameter;
  12. }
  13. protected override Expression VisitParameter(ParameterExpression node)
  14. {
  15. return base.VisitParameter(_parameter);
  16. }
  17. }
  18. public static class IQueryableExtensions
  19. {
  20. public static IOrderedQueryable<T> SortBy<T>(this IQueryable<T> source, Expression property)
  21. {
  22. return source.OrderBy(ToLambda<T>(property));
  23. }
  24. public static IOrderedQueryable<T> SortByDescending<T>(this IQueryable<T> source, Expression property)
  25. {
  26. return source.OrderByDescending(ToLambda<T>(property));
  27. }
  28. public static Expression<Func<T, object>> ToLambda<T>(Expression property)
  29. {
  30. //var type = typeof(T);
  31. //var body = property;
  32. //var parameter = Expression.Parameter(type,"x");
  33. //var delegateType = typeof(Func<,>).MakeGenericType(type, typeof(Object));
  34. //dynamic lambda = Expression.Lambda(delegateType, body, parameter);
  35. //dynamic comp = lambda.Compile();
  36. //return comp;
  37. var paramExpr = Expression.Parameter(typeof(T));
  38. var exprBody = Expression.Convert(property, typeof(object));
  39. var replBody = new ParameterReplacer(paramExpr).Visit(exprBody);
  40. var finalExpr = Expression.Lambda<Func<T, object>>(replBody, paramExpr);
  41. return finalExpr;
  42. }
  43. }
  44. }