Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. private Expression<Func<Task, T>> Generate(string orderby)
  2. {
  3. switch (orderby)
  4. {
  5. case "Time":
  6. return t => t.Time;
  7. case "Money":
  8. return t => t.RewardMoney;
  9. default:
  10. return t => t.Id;
  11. }
  12. }
  13.  
  14. _context.Items.OrderBy(Generate("Money"));
  15.  
  16. private Expression<Func<Task, object>> Generate(string orderby)
  17.  
  18. public static IOrderedQueryable<TSource> OrderBy<TSource>(
  19. this IQueryable<TSource> query, string propertyName)
  20. {
  21. var entityType = typeof(TSource);
  22.  
  23. //Create x=>x.PropName
  24. var propertyInfo = entityType.GetProperty(propertyName);
  25. ParameterExpression arg = Expression.Parameter(entityType, "x");
  26. MemberExpression property = Expression.Property(arg, propertyName);
  27. var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
  28.  
  29. //Get System.Linq.Queryable.OrderBy() method.
  30. var enumarableType = typeof(System.Linq.Queryable);
  31. var method = enumarableType.GetMethods()
  32. .Where(m => m.Name == "OrderBy" && m.IsGenericMethodDefinition)
  33. .Where(m =>
  34. {
  35. var parameters = m.GetParameters().ToList();
  36. //Put more restriction here to ensure selecting the right overload
  37. return parameters.Count == 2;//overload that has 2 parameters
  38. }).Single();
  39. //The linq's OrderBy<TSource, TKey> has two generic types, which provided here
  40. MethodInfo genericMethod = method
  41. .MakeGenericMethod(entityType, propertyInfo.PropertyType);
  42.  
  43. /*Call query.OrderBy(selector), with query and selector: x=> x.PropName
  44. Note that we pass the selector as Expression to the method and we don't compile it.
  45. By doing so EF can extract "order by" columns and generate SQL for it.*/
  46. var newQuery = (IOrderedQueryable<TSource>)genericMethod
  47. .Invoke(genericMethod, new object[] { query, selector });
  48. return newQuery;
  49. }
  50.  
  51. var cheapestItems = _context.Items.OrderBy("Money").Take(10).ToList();
  52.  
  53. SELECT TOP (10) {coulmn names} FROM [dbo].[Items] AS [Extent1]
  54. ORDER BY [Extent1].[Money] ASC
  55.  
  56. private Expression<Func<Task, TResult>> Generate<TResult>(string orderby)
  57. {
  58. switch (orderby)
  59. {
  60. case "Time":
  61. return t => t.Time;
  62. case "Money":
  63. return t => t.RewardMoney;
  64. default:
  65. return t => t.Id;
  66. }
  67. }
  68.  
  69. _context.Items.OrderBy(Generate<decimal>("Money"));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement