Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.17 KB | None | 0 0
  1. using KindergartenApp.Core.Extensions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Dynamic;
  6. using System.Linq.Expressions;
  7. using System.Reflection;
  8. using KindergartenApp.Core.Filtering;
  9.  
  10. namespace KindergartenApp.Core.Extensions
  11. {
  12. public static class QueryableExtensions
  13. {
  14. public static IQueryable<T> SortIQueryable<T>(this IQueryable<T> data, string fieldName, string sortOrder)
  15. {
  16. if (string.IsNullOrWhiteSpace(fieldName)) return data;
  17. if (string.IsNullOrWhiteSpace(sortOrder)) return data;
  18.  
  19. var param = Expression.Parameter(typeof(T), "i");
  20.  
  21. MemberExpression property = null;
  22. string[] fieldNames = fieldName.Split('.');
  23. foreach (string filed in fieldNames)
  24. {
  25. property = property == null ? Expression.Property(param, filed) : Expression.Property(property, filed);
  26. }
  27.  
  28. if (property.Type.IsValueType)
  29. {
  30. Expression valConvertion = Expression.ConvertChecked(property, property.Type);
  31.  
  32. if (property.Type == typeof(int))
  33. {
  34. var myValSortExpression = Expression.Lambda<Func<T, int>>(valConvertion, param);
  35.  
  36. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  37. : data.OrderBy(myValSortExpression);
  38. }
  39. if (property.Type == typeof(double))
  40. {
  41. var myValSortExpression = Expression.Lambda<Func<T, double>>(valConvertion, param);
  42.  
  43. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  44. : data.OrderBy(myValSortExpression);
  45. }
  46. if (property.Type == typeof(long))
  47. {
  48. var myValSortExpression = Expression.Lambda<Func<T, long>>(valConvertion, param);
  49.  
  50. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  51. : data.OrderBy(myValSortExpression);
  52. }
  53. if (property.Type == typeof(byte))
  54. {
  55. var myValSortExpression = Expression.Lambda<Func<T, byte>>(valConvertion, param);
  56.  
  57. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  58. : data.OrderBy(myValSortExpression);
  59. }
  60. if (property.Type == typeof(bool))
  61. {
  62. var myValSortExpression = Expression.Lambda<Func<T, bool>>(valConvertion, param);
  63.  
  64. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  65. : data.OrderBy(myValSortExpression);
  66. }
  67. if (property.Type == typeof(bool?))
  68. {
  69. var myValSortExpression = Expression.Lambda<Func<T, bool?>>(valConvertion, param);
  70.  
  71. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  72. : data.OrderBy(myValSortExpression);
  73. }
  74. if (property.Type == typeof(DateTime))
  75. {
  76. var myValSortExpression = Expression.Lambda<Func<T, DateTime>>(valConvertion, param);
  77.  
  78. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  79. : data.OrderBy(myValSortExpression);
  80. }
  81.  
  82. if (property.Type == typeof(DateTime?))
  83. {
  84. var myValSortExpression = Expression.Lambda<Func<T, DateTime?>>(valConvertion, param);
  85.  
  86. return (sortOrder == "desc") ? data.OrderByDescending(myValSortExpression)
  87. : data.OrderBy(myValSortExpression);
  88. }
  89. }
  90.  
  91. Expression conversion = Expression.ConvertChecked(property, property.Type);
  92. var mySortExpression = Expression.Lambda<Func<T, object>>(conversion, param);
  93.  
  94. return (sortOrder == "desc") ? data.OrderByDescending(mySortExpression)
  95. : data.OrderBy(mySortExpression);
  96. }
  97.  
  98. public static IQueryable<T> WhereQueryable<T>(this IQueryable<T> data, IList<FilterModel> filters)
  99. {
  100. var separator = " || ";
  101.  
  102. var itemstType = typeof(T);
  103. var containsPredicate = new List<string>();
  104. var numbersPredicate = new List<string>();
  105. var dateTimePredicate = new List<string>();
  106.  
  107. foreach (var filter in filters)
  108. {
  109. var isNested = filter.Name.Contains(".");
  110.  
  111. if (isNested)
  112. {
  113. containsPredicate.Add($"{filter.Name}.Contains(\"{filter.Term}\")");
  114. continue;
  115. }
  116.  
  117. var propertyType = itemstType.GetProperty(filter.Name);
  118. if (propertyType != null)
  119. {
  120. var filterType = propertyType.PropertyType;
  121.  
  122. if (filterType == typeof(string))
  123. {
  124. containsPredicate.Add($"{filter.Name}.Contains(\"{filter.Term}\")");
  125. }
  126.  
  127. if (filterType == typeof(long) || filterType == typeof(int) || filterType == typeof(byte))
  128. {
  129. numbersPredicate.Add($"{filter.Name} = {filter.Term}");
  130. }
  131.  
  132. if (filterType == typeof(DateTime))
  133. {
  134. // itmes = items.Where(string.Format("{0} > @0", searchField),
  135. //DateTime.Parse(searchString));
  136.  
  137. var dt = DateTime.Parse(filter.Term);
  138. //dateTimePredicate.Add($"{filter.Name} = Date({dt.Date.Year}, {dt.Date.Month}, {dt.Date.Day})");
  139. //dateTimePredicate.Add($"{filter.Name} == DateTime.Parse(\"{filter.Term}\")");
  140. //dateTimePredicate.Add($"DbFunctions.TruncateTime({filter.Name}) == {dt}");
  141. }
  142. }
  143. }
  144.  
  145. var predicate = string.Join(separator, containsPredicate);
  146.  
  147. if (!string.IsNullOrEmpty(predicate))
  148. data = data.Where(predicate);
  149.  
  150. var numPredicate = string.Join(separator, numbersPredicate);
  151.  
  152. if(!string.IsNullOrEmpty(numPredicate))
  153. data = data.Where(numPredicate);
  154.  
  155. var dtPredicate = string.Join(separator, dateTimePredicate);
  156.  
  157. if (!string.IsNullOrEmpty(dtPredicate))
  158. data = data.Where(dtPredicate);
  159.  
  160. return data;
  161. }
  162.  
  163. public static Expression<Func<T, bool>> False<T>() { return f => false; }
  164.  
  165. public static Expression<Func<T, bool>> In<T, TValue>(this Expression<Func<T, bool>> predicate, string propertyName, List<TValue> values)
  166. {
  167. var param = predicate.Parameters.Single();
  168. MemberExpression property = Expression.PropertyOrField(param, propertyName);
  169. var micontain = typeof(List<TValue>).GetMethod("Contains");
  170. var mc = Expression.Call(Expression.Constant(values), micontain, property);
  171. return Expression.Lambda<Func<T, bool>>(mc, param);
  172. }
  173. }
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement