internal void AddColumn <TKey>(TControl value, Expression <Func <TEntity, TKey> > column) { var sortExpression = new TableSortOperation { CreateSort = (isPrimary, direction) => { if (isPrimary) { return(direction == SortDirection.Ascending ? (Func <IQueryable <TEntity>, IOrderedQueryable <TEntity> >) (queryable => queryable.OrderBy(column)) : queryable => queryable.OrderByDescending(column)); } else { return(direction == SortDirection.Ascending ? (Func <IQueryable <TEntity>, IOrderedQueryable <TEntity> >) (queryable => ((IOrderedQueryable <TEntity>)queryable).ThenBy(column)) : (queryable => ((IOrderedQueryable <TEntity>)queryable).ThenByDescending(column))); } } }; _columns[value] = sortExpression; }
public IOrderedQueryable <TEntity> Sort(TRequest request, IQueryable <TEntity> queryable) { TableSortOperation sortOperation = null; var value = _controls[0].Control(request); var direction = _controls[0].Direction(request); if (value == null || !_columns.TryGetValue(value, out sortOperation)) { if (_defaultColumn != null) { _columns.TryGetValue(_defaultColumn, out sortOperation); } } if (sortOperation == null) { return(_columns.Values.First().CreateSort(true, SortDirection.Default)(queryable)); } var sort = sortOperation.CreateSort(true, direction); var result = sort(queryable); foreach (var ctrl in _controls.Skip(1)) { value = ctrl.Control(request); direction = ctrl.Direction(request); if (value == null || !_columns.TryGetValue(value, out sortOperation)) { continue; } sort = sortOperation.CreateSort(false, direction); result = sort(result); } return(result); }