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 modifiedQuery = query; var useThenBy = false; foreach (var term in terms) { var propertyInfo = ExpressionHelper .GetPropertyInfo <TEntity>(term.EntityName ?? term.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, term.Descending, propertyInfo.PropertyType, keySelector); useThenBy = true; } return(modifiedQuery); }
public IQueryable <TEntity> Apply(IQueryable <TEntity> query) { var terms = GetValidTerms().ToArray(); if (!terms.Any()) { return(query); } var modifiedQuery = query; foreach (var term in terms) { var propertyInfo = ExpressionHelper .GetPropertyInfo <TEntity>(term.EntityName ?? term.Name); var obj = ExpressionHelper.Parameter <TEntity>(); // Build up the LINQ expression backwards: // query = query.Where(x => x.Property == "Value"); // x.Property var left = ExpressionHelper.GetPropertyExpression(obj, propertyInfo); // "Value" var right = term.ExpressionProvider.GetValue(term.Value); // x.Property == "Value" var comparisonExpression = term.ExpressionProvider .GetComparison(left, term.Operator, right); // x => x.Property == "Value" var lambdaExpression = ExpressionHelper .GetLambda <TEntity, bool>(obj, comparisonExpression); // query = query.Where... modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } return(modifiedQuery); }