public IQueryable<T> ApplyFiltersAndSort<T>(DataTablesParam dtParameters, IQueryable<T> data, DataTablesPropertyInfo[] columns) { if (!String.IsNullOrEmpty(dtParameters.sSearch)) { var parts = new List<string>(); var parameters = new List<object>(); for (var i = 0; i < dtParameters.iColumns; i++) { if (dtParameters.bSearchable[i]) { try { parts.Add(GetFilterClause(dtParameters.sSearch, columns[i], parameters)); } catch (Exception) { //if the clause doesn't work, skip it! } } } var values = parts.Where(p => p != null); data = data.Where(string.Join(" or ", values), parameters.ToArray()); } for (int i = 0; i < dtParameters.sSearchValues.Count; i++) { if (dtParameters.bSearchable[i]) { var searchColumn = dtParameters.sSearchValues[i]; if (!string.IsNullOrWhiteSpace(searchColumn)) { DataTablesPropertyInfo column = FindColumn(dtParameters, columns, i); var parameters = new List<object>(); var filterClause = GetFilterClause(searchColumn, column, parameters); if (string.IsNullOrWhiteSpace(filterClause) == false) { data = data.Where(filterClause, parameters.ToArray()); } } } } string sortString = ""; for (int i = 0; i < dtParameters.iSortingCols; i++) { int columnNumber = dtParameters.iSortCol[i]; DataTablesPropertyInfo column = FindColumn(dtParameters, columns, columnNumber); string columnName = column.PropertyInfo.Name; string sortDir = dtParameters.sSortDir[i]; if (i != 0) sortString += ", "; sortString += columnName + " " + sortDir; } if (string.IsNullOrWhiteSpace(sortString)) { sortString = columns[0].PropertyInfo.Name; } data = data.OrderBy(sortString); return data; }
private DataTablesPropertyInfo FindColumn(DataTablesParam dtParameters, DataTablesPropertyInfo[] columns, int i) { if (dtParameters.sColumnNames.Any()) { return columns.First(x => x.PropertyInfo.Name == dtParameters.sColumnNames[i]); } else { return columns[i]; } }