public ActionResult GetAll(GridRequestViewModel <TViewModel> requestModel) { var query = _context.Set <TModel>().AsQueryable(); AddSpecificQuery(ref query); query = query.ProcessDinamicQuery(requestModel); var noOfPages = query.Count() / requestModel.Pagination.Number; var result = query.Skip(requestModel.Pagination.Start).Take(requestModel.Pagination.Number).ToList(); var models = result.Select(q => _mapper.Map <TViewModel>(q)).ToList(); var jsonResult = Json(new { Data = models, NoOfPages = noOfPages }, JsonRequestBehavior.AllowGet); jsonResult.MaxJsonLength = int.MaxValue; return(jsonResult); }
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var gridRequest = new GridRequestViewModel(); gridRequest.RowStartIndex = GetValueOrDefault <int>(bindingContext, "iDisplayStart"); gridRequest.RowCount = GetValueOrDefault <int>(bindingContext, "iDisplayLength"); gridRequest.GridCustomData = GetStringOrEmpty(bindingContext, "sEcho"); gridRequest.Search = GetStringOrEmpty(bindingContext, "sSearch"); var columnNames = GetStringOrEmpty(bindingContext, "sColumns").Split(','); var sortColumnIndex = GetValueOrDefault <int>(bindingContext, "iSortCol_0"); var sortDir = GetStringOrEmpty(bindingContext, "sSortDir_0").ToLower(); gridRequest.SortColumnName = sortColumnIndex >= 0 && sortColumnIndex < columnNames.Length ? columnNames[sortColumnIndex] : null; gridRequest.SortDirection = sortDir == "asc" ? SortDirection.Ascending : SortDirection.Descending; return(gridRequest); }
public virtual async Task <ActionResult> Load(GridRequestViewModel gridRequest) { //Initial load data var filter = Session["FlightSearchFilter"] != null ? (string)Session["FlightSearchFilter"] : string.Empty; var count = 0; Filtro filtro = new Filtro { Flight = filter }; var flightList = await flightService.GetFlights(filtro.Flight); var displayRecords = flightList.Count; var totalRecords = 10; //var dateFormat = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "en" ? "MM/dd/yyyy" : "dd/MM/yyyy"; //System.Globalization.DateTimeFormatInfo dtfi = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat; //dtfi.DateSeparator = "/"; //Create JSON value for pass the view return(Json(new { iTotalDisplayRecords = displayRecords, iTotalRecords = totalRecords, sEcho = gridRequest.GridCustomData, aaData = flightList.Select(d => new { d.Id, d.Airline, d.SourceAirportID, d.SourceAirportName, d.DestinationAirportID, d.DestinationAirportName, d.Distance, d.FuelNeeded, d.Stops, d.Active }) })); }
public static IQueryable <T> ProcessDinamicQuery <T, P>( this IQueryable <T> source, GridRequestViewModel <P> requestModel, char propertyNavigationSplitter = '_') where P : new() { var query = source; bool isSorted = false; foreach (var aProperty in requestModel.Search.PredicateObject.GetType().GetProperties()) { if (aProperty.GetValue(requestModel.Search.PredicateObject) == null) { continue; } var param = Expression.Parameter(typeof(T), "p"); if (typeof(P).GetProperty(aProperty.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).PropertyType == typeof(string)) { string[] props = aProperty.Name.Split(propertyNavigationSplitter); if (!PropertyExists <T>(props[0])) { continue; } Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach (string prop in props) { PropertyInfo pi = type.GetProperty(prop); expr = Expression.Property(expr, pi); type = pi.PropertyType; } var attr = (FilterOperatorAttribute[])aProperty.GetCustomAttributes(typeof(FilterOperatorAttribute), false); if (attr.Length > 0) { if (!string.IsNullOrEmpty(attr[0].DbField)) { expr = Expression.Property(arg, attr[0].DbField); } } var value = Expression.Constant(aProperty.GetValue(requestModel.Search.PredicateObject)); var containsmethod = type.GetMethod("Contains", new[] { typeof(string) }); var call = Expression.Call(expr, containsmethod, value); var lambda = Expression.Lambda <Func <T, bool> >(call, arg); query = query.Where(lambda); } else { string[] props = aProperty.Name.Split(propertyNavigationSplitter); if (!PropertyExists <T>(props[0])) { continue; } Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach (string prop in props) { PropertyInfo pi = type.GetProperty(prop); expr = Expression.Property(expr, pi); type = pi.PropertyType; } var value = Expression.Constant(aProperty.GetValue(requestModel.Search.PredicateObject)); FilterOperatorViewModel _operator = FilterOperatorViewModel.Equals; var attr = (FilterOperatorAttribute[])aProperty.GetCustomAttributes(typeof(FilterOperatorAttribute), false); if (attr.Length > 0) { if (attr[0].Operator != null) { _operator = attr[0].Operator.Value; } if (!string.IsNullOrEmpty(attr[0].DbField)) { expr = Expression.Property(arg, attr[0].DbField); } } if (typeof(P).GetProperty(aProperty.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).PropertyType == typeof(DateTime?)) { var dateVal = ((DateTime)aProperty.GetValue(requestModel.Search.PredicateObject)).AddDays(1).AddTicks(-1); if (_operator == FilterOperatorViewModel.GreaterOrEquals) { dateVal = dateVal.AddDays(-1); } value = Expression.Constant(dateVal); } BinaryExpression binaryExpression = Expression.Equal(Expression.Property(arg, aProperty.Name), value); if (_operator == FilterOperatorViewModel.GreaterOrEquals) { binaryExpression = Expression.GreaterThanOrEqual(Expression.Property(arg, aProperty.Name), value); } if (_operator == FilterOperatorViewModel.LessOrEquals) { binaryExpression = Expression.LessThanOrEqual(Expression.Property(arg, aProperty.Name), value); } var exp = Expression.Lambda <Func <T, bool> >(binaryExpression, arg); query = query.Where(exp); } } if (!string.IsNullOrEmpty(requestModel.Sort.Predicate)) { isSorted = true; if (requestModel.Sort.Reverse) { query = query.OrderByDescending(requestModel.Sort.Predicate); } else { query = query.OrderBy(requestModel.Sort.Predicate); } } if (!isSorted) { query = query.OrderBy("Id"); } return(query); }