Advertisement
Guest User

thekindofme

a guest
Feb 25th, 2009
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.74 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Data.Objects;
  5. using System.Linq;
  6. using System.Web;
  7.  
  8. namespace EMS.Lib.Helpers
  9. {
  10.     public class EmExtJSGridFilterHelper
  11.     {
  12.         public static List<T> GetResults<T>(HttpRequestBase request, ObjectQuery<T> query, out int totalOjectCount)
  13.         {
  14.             return GetResults(request, query, out totalOjectCount, "");
  15.         }
  16.  
  17.         public static List<T> GetResults<T>(HttpRequestBase request, ObjectQuery<T> query, out int totalOjectCount, string includes)
  18.         {
  19.             var sort = request.Params["sort"];
  20.             var dir = request.Params["dir"];
  21.  
  22.             //get non null values
  23.             int intStart, intLimit;
  24.             if (!int.TryParse(request.Params["start"], out intStart)) intStart = 0;
  25.             if (!int.TryParse(request.Params["limit"], out intLimit)) intLimit = 10;
  26.  
  27.             List<T> objectsList;
  28.  
  29.             if(!string.IsNullOrEmpty(includes)) query = query.Include(includes);//ex:- if Category was passed in with includes, a resulting Item list's item's would have the category property loaded(a category object will be there)
  30.             totalOjectCount = query.Count();
  31.             var i = 0;
  32.             var exspressions = new List<string>();
  33.             var parameters = new List<ObjectParameter>();
  34.             while (true) //check for filters starting from 0, if one exists move to the next one(0 -> 1...), .
  35.             {
  36.                 if (!Filter.checkExistence(i, request.Params)) break; //...if not stop looking further
  37.                 var expression = new Filter(i, request).getExpression();
  38.                 exspressions.Add(expression.Expression);
  39.                 parameters.AddRange(expression.Parameters);
  40.                 i++; //keep track of index
  41.             }
  42.             var exspression = string.Format("({0})", string.Join("AND", exspressions.ToArray()));
  43.             //build the final expression
  44.             if (exspression != "()") query = query.Where(exspression, parameters.ToArray()); //filter agents collection on the expression
  45.  
  46.             if (sort != null) //do sorting
  47.             {
  48.                 objectsList = query.OrderBy("it." + sort).ToList();
  49.                 if (dir == "DESC") objectsList.Reverse();
  50.             }
  51.             else
  52.             {
  53.                 objectsList = query.ToList();
  54.             }
  55.  
  56.             if (intStart + intLimit > objectsList.Count)intLimit = objectsList.Count - intStart; //make sure the range we select is valid
  57.             objectsList = objectsList.GetRange(intStart, intLimit);
  58.             return objectsList;
  59.         }
  60.  
  61.         #region Nested type: Filter
  62.  
  63.         public class Filter
  64.         {
  65.             public string Datacomparison { get; set; }
  66.             public string DataType { get; set; }
  67.             public string DataValue { get; set; }
  68.             public string Field { get; set; }
  69.  
  70.             public int Id { get; set; }
  71.  
  72.             public static bool checkExistence(int filterIndex, NameValueCollection @params)
  73.             {
  74.                 return (@params[string.Format("filter[{0}][field]", filterIndex)] != null);
  75.             }
  76.  
  77.             public Filter(int id, HttpRequestBase request)
  78.             {
  79.                 Id = id;
  80.                 Field = request.Params[string.Format("filter[{0}][field]", id)];
  81.                 DataType = request.Params[string.Format("filter[{0}][data][type]", id)];
  82.                 DataValue = request.Params[string.Format("filter[{0}][data][value]", id)];
  83.                 Datacomparison = request.Params[string.Format("filter[{0}][data][comparison]", id)];
  84.             }
  85.  
  86.             public FilterExpressionResult getExpression()
  87.             {
  88.                 string expressionString = null;
  89.                 var expressionParams = new List<ObjectParameter>(); //paramerters collection
  90.                 switch (DataType)
  91.                 {
  92.                     case "string":
  93.                         expressionString = string.Format("(it.{0} like '{1}%')", Field, DataValue);
  94.                         break;
  95.                     case "boolean":
  96.                         expressionString = string.Format("(it.{0} = {1})", Field, DataValue);
  97.                         break;
  98.                     case "numeric":
  99.                         switch (Datacomparison)
  100.                         {
  101.                             case "gt":
  102.                                 Datacomparison = ">";
  103.                                 break;
  104.                             case "lt":
  105.                                 Datacomparison = "<";
  106.                                 break;
  107.                             default:
  108.                                 Datacomparison = "=";
  109.                                 break;
  110.                         }
  111.                         expressionString = string.Format("(it.{0} {2} {1})", Field, DataValue, Datacomparison);
  112.                         break;
  113.                     case "date":
  114.                         switch (Datacomparison)
  115.                         {
  116.                             case "gt":
  117.                                 Datacomparison = ">";
  118.                                 break;
  119.                             case "lt":
  120.                                 Datacomparison = "<";
  121.                                 break;
  122.                             default:
  123.                                 Datacomparison = "=";
  124.                                 break;
  125.                         }
  126.  
  127.                         expressionParams.Add(new ObjectParameter("Param" + Id, DateTime.Parse(DataValue)));
  128.                         expressionString = string.Format("(it.{0} {2} {1})", Field, "@" + "Param" + Id, Datacomparison);
  129.                         break;
  130.                     case "list":
  131.                         var split = DataValue.Split(new[] { ',' });
  132.                         var r = new string[split.Length];
  133.                         for (var i = 0; i < split.Length; i++)
  134.                         {
  135.                             r[i] = string.Format("(it.{0} = '{1}')", Field, split[i]);
  136.                         }
  137.                         expressionString = string.Format("({0})", string.Join("OR", r));
  138.                         break;
  139.                 }
  140.                 return expressionString != null
  141.                            ? new FilterExpressionResult { Expression = expressionString, Parameters = expressionParams }
  142.                            : null;
  143.             }
  144.  
  145.             #region Nested type: FilterExpressionResult
  146.  
  147.             public class FilterExpressionResult
  148.             {
  149.                 public string Expression { get; set; }
  150.                 public List<ObjectParameter> Parameters { get; set; }
  151.             }
  152.  
  153.             #endregion
  154.         }
  155.  
  156.         #endregion
  157.     }
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement