public static string BuildWhereClause <T>(FilterInfo filter, int index, List <object> parameters) { var entityType = (typeof(T)); var property = entityType.GetProperty(filter.Field); string[] filterArray = filter.Field.Split('.'); if (filterArray.Length > 1) { foreach (var str in filterArray) { property = entityType.GetProperty(str); if (property.PropertyType.Namespace == "System.Collections.Generic") { entityType = property.PropertyType.GenericTypeArguments[0]; } else { entityType = property.PropertyType; } } } var parameterIndex = parameters.Count; switch (filter.Operator.ToLower()) { case "eq": case "neq": case "gte": case "gt": case "lte": case "lt": //penanganan untuk atribut yang tidak terdapat di kelas (dari foreign key), misalnya contractor.name di model project //kemungkinan akan bermasalah kalau atribut bukan string, misalnya contractor.id if (property != null) { if ((typeof(Nullable <DateTime>).IsAssignableFrom(property.PropertyType)) || (typeof(DateTime).IsAssignableFrom(property.PropertyType))) { parameters.Add(DateTime.Parse(filter.Value).Date); return(string.Format("EntityFunctions.TruncateTime(" + filter.Field + ")" + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } if (typeof(int).IsAssignableFrom(property.PropertyType)) { parameters.Add(int.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } //belum ditangani di source code asli if (typeof(Nullable <Byte>).IsAssignableFrom(property.PropertyType)) { parameters.Add(int.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } if (typeof(Nullable <int>).IsAssignableFrom(property.PropertyType)) { parameters.Add(int.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } if (typeof(Boolean).IsAssignableFrom(property.PropertyType)) { parameters.Add(Boolean.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } if (typeof(Guid).IsAssignableFrom(property.PropertyType)) { parameters.Add(Guid.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } if (typeof(decimal).IsAssignableFrom(property.PropertyType)) { parameters.Add(Decimal.Parse(filter.Value)); return(string.Format(filter.Field + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); } } parameters.Add(filter.Value.ToLower()); return(string.Format(filter.Field + ".ToLower()" + ToLinqOperator(filter.Operator) + "@" + parameterIndex)); case "startswith": parameters.Add(filter.Value.ToLower()); return(filter.Field + ".ToLower().StartsWith(" + "@" + parameterIndex + ")"); case "endswith": parameters.Add(filter.Value.ToLower()); return(filter.Field + ".ToLower().EndsWith(" + "@" + parameterIndex + ")"); case "contains": parameters.Add(filter.Value.ToLower()); return(filter.Field + ".ToLower().Contains(" + "@" + parameterIndex + ")"); case "notcontains": parameters.Add(filter.Value.ToLower()); return("!" + filter.Field + ".ToLower().Contains(" + "@" + parameterIndex + ")"); default: throw new ArgumentException("This operator is not yet supported for this Grid", filter.Operator); } }
//TODO: pull default values from config internal void Populate() { if (HttpContext.Current != null) { HttpRequest curRequest = HttpContext.Current.Request; if (curRequest["page"] != null) { this.Page = int.Parse(curRequest["page"]); } if (curRequest["pageSize"] != null) { this.PageSize = int.Parse(curRequest["pageSize"]); } if (curRequest["skip"] != null) { this.Skip = int.Parse(curRequest["skip"]); } if (curRequest["take"] != null) { this.Take = int.Parse(curRequest["take"]); } //this.FilterLogic = curRequest["filter[logic]"]; //build sorting objects var sorts = new List <SortingInfo>(); var x = 0; while (x < 20) { var sortDirection = curRequest["sort[" + x + "][dir]"]; if (sortDirection == null) { break; } var sortOn = curRequest["sort[" + x + "][field]"]; if (sortOn != null) { sorts.Add(new SortingInfo { SortOn = sortOn, SortOrder = sortDirection }); } x++; } Sortings = sorts; //build filter objects var filters = new FilterInfo(); var logic = curRequest["filter[logic]"]; filters.Logic = logic; bool stopLevel1 = false; int level1 = 0; while (!stopLevel1) { FilterInfo fi = new FilterInfo(); var field1 = curRequest["filter[filters][" + level1 + "][field]"]; if (field1 == null) { field1 = curRequest["filter[filters][" + level1 + "][filters][0][field]"]; if (field1 == null) { stopLevel1 = true; } else //level 1 { fi.Logic = curRequest["filter[filters][" + level1 + "][logic]"]; bool stopLevel2 = false; int level2 = 0; while (!stopLevel2) { var field2 = curRequest["filter[filters][" + level1 + "][filters][" + level2 + "][field]"]; if (field2 == null) { stopLevel2 = true; } else { var fi2 = new FilterInfo(); fi2.Field = curRequest["filter[filters][" + level1 + "][filters][" + level2 + "][field]"]; fi2.Operator = curRequest["filter[filters][" + level1 + "][filters][" + level2 + "][operator]"]; fi2.Value = curRequest["filter[filters][" + level1 + "][filters][" + level2 + "][value]"]; if (fi.Filters == null) { fi.Filters = new List <FilterInfo>(); } fi.Filters.Add(fi2); ++level2; } } } } else { fi.Field = field1; fi.Operator = curRequest["filter[filters][" + level1 + "][operator]"]; fi.Value = curRequest["filter[filters][" + level1 + "][value]"]; } if (!stopLevel1) { if (filters.Filters == null) { filters.Filters = new List <FilterInfo>(); } filters.Filters.Add(fi); ++level1; } } Filters = filters; } }