Guest User

Untitled

a guest
Mar 21st, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4.  
  5. public static class QuerySearchExtensions
  6. {
  7.  
  8. private static Expression<Func<T, bool>> BuildSearchExpression<T>(string search)
  9. {
  10. Expression baseExpression = null; // Expression.Constant(true);
  11. var parameter = Expression.Parameter(typeof(T), "x");
  12.  
  13. var type = typeof(T);
  14. foreach (var property in type.GetProperties())
  15. {
  16. Expression expression = null;
  17.  
  18. if (property.GetGetMethod().IsVirtual)
  19. {
  20. // ignore
  21. }
  22. else if (property.PropertyType.Equals(typeof(string)))
  23. {
  24. Expression member = Expression.Property(parameter, property.Name);
  25. member = Expression.Coalesce(member, Expression.Constant(""));
  26.  
  27. Type[] properties = new Type[0];
  28. var methodToLower = typeof(string).GetMethod("ToLower", properties);
  29. member = Expression.Call(member, methodToLower);
  30.  
  31. var methodContains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  32. var valueSearch = Expression.Constant(search.ToLower(), typeof(string));
  33. expression = Expression.Call(member, methodContains, valueSearch);
  34. }
  35. else if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
  36. {
  37. Expression member = Expression.Property(parameter, property.Name);
  38.  
  39. var stringConvertMethod = typeof(Object).GetMethod("ToString");
  40. member = Expression.Call(member, stringConvertMethod);
  41.  
  42. member = Expression.Coalesce(member, Expression.Constant(""));
  43.  
  44.  
  45. var methodContains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  46. var valueSearch = Expression.Constant(search, typeof(string));
  47. expression = Expression.Call(member, methodContains, valueSearch);
  48. }
  49. else
  50. {
  51. Expression member = Expression.Property(parameter, property.Name);
  52.  
  53. var stringConvertMethod = typeof(Object).GetMethod("ToString");
  54. member = Expression.Call(member, stringConvertMethod);
  55.  
  56. var methodContains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  57. var valueSearch = Expression.Constant(search, typeof(string));
  58. expression = Expression.Call(member, methodContains, valueSearch);
  59. }
  60.  
  61. if (expression != null)
  62. {
  63. if (baseExpression == null)
  64. baseExpression = expression;
  65. else
  66. baseExpression = Expression.Or(expression, baseExpression);
  67. }
  68. }
  69.  
  70. return Expression.Lambda<Func<T, bool>>(baseExpression, parameter);
  71. }
  72.  
  73.  
  74. public static IQueryable<T> Search<T>(this IQueryable<T> queryable, string search)
  75. {
  76. if (string.IsNullOrEmpty(search))
  77. return queryable;
  78.  
  79. var func = BuildSearchExpression<T>(search).Compile();
  80. return queryable.Where<T>(m => func(m));
  81. }
  82.  
  83. }
Add Comment
Please, Sign In to add comment