public IQueryable <TEntity> Apply(IQueryable <TEntity> query) { var terms = GetValidTerms().ToArray(); if (!terms.Any()) { terms = GetTermsFromModel().Where(t => t.Default).ToArray(); } if (!terms.Any()) { return(query); } var modifiedQuerry = query; var useThenBy = false; foreach (var term in terms) { var propertyInfo = ExpressionHelper.GetPropertyInfo <TEntity>(term.Name); var obj = ExpressionHelper.Parameter <TEntity>(); var key = ExpressionHelper.GetPropertyExpression(obj, propertyInfo); var keySelector = ExpressionHelper.GetLambda(typeof(TEntity), propertyInfo.PropertyType, obj, key); modifiedQuerry = ExpressionHelper.CallOrderByOrThenBy(modifiedQuerry, useThenBy, term.Descending, propertyInfo.PropertyType, keySelector); useThenBy = true; } return(modifiedQuerry); }
/// <summary> /// Apply the given sorting. /// </summary> /// <param name="query">The base query where the sorting will apply.</param> /// <returns></returns> public IQueryable <TEntity> Apply(IQueryable <TEntity> query) { var validSolidTerms = GetValidSortTerms().ToArray(); if (!validSolidTerms.Any()) { validSolidTerms = GetSortablePropertiesFromModel() .Where(t => t.IsDefault).ToArray(); } if (!validSolidTerms.Any()) { return(query); } var modifiedQuery = query; var useThenBy = false; foreach (var sortTerm in validSolidTerms) { var propertyInfo = ExpressionHelper.GetPropertyInfo <TEntity>(sortTerm.EntityName ?? sortTerm.Name); var obj = ExpressionHelper.Parameter <TEntity>(); // Build the LINQ expression backwards: // query = query.OrderBy(x => x.Property); // x => x.Property var key = ExpressionHelper .GetPropertyExpression(obj, propertyInfo); var keySelector = ExpressionHelper .GetLambda(typeof(TEntity), propertyInfo.PropertyType, obj, key); // query.OrderBy/ThenBy[Descending](x => x.Property) modifiedQuery = ExpressionHelper .CallOrderByOrThenBy(modifiedQuery, useThenBy, sortTerm.IsDescending, propertyInfo.PropertyType, keySelector); useThenBy = true; } return(modifiedQuery); }