public IQueryable <TEntity> Apply <TEntity>(IQueryable <TEntity> query, List <SynapseSearchTerm> terms) { if (!terms.Any()) { return(query); } var modifiedQuery = query; foreach (var term in terms) { if (term.Name.Contains(".")) { var termNames = term.Name.Split("."); ParameterExpression pe = Expression.Parameter(typeof(TEntity), "entity"); MemberExpression left = Expression.Property(pe, termNames[0]); for (int typeIndex = 1; typeIndex < termNames.Length; typeIndex++) { left = Expression.Property(left, termNames[typeIndex]); } // "Value" var right = term.ExpressionProvider.GetValue(term.Value); // x.Property == "Value" var comparisonExpression = term.ExpressionProvider.GetComparison(left, term.Op, right); // x => x.Property == "Value" var lambdaExpression = ExpressionHelper.GetLambda <TEntity, bool>(pe, comparisonExpression); // query = query.Where... modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } else { var propertyInfo = ExpressionHelper.GetPropertyInfo <TEntity>(term.Name); var obj = ExpressionHelper.Parameter <TEntity>(); // 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.Op, right); // x => x.Property == "Value" var lambdaExpression = ExpressionHelper.GetLambda <TEntity, bool>(obj, comparisonExpression); // query = query.Where... modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } } 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.Name); var obj = ExpressionHelper.Parameter <TEntity>(); var left = ExpressionHelper.GetPropertyExpression(obj, propertyInfo); var right = term.ExpressionProvider.GetValue(term.Value); var comparisionExpression = term.ExpressionProvider .GetComparison(left, term.Operator, right); var lambdaExpression = ExpressionHelper.GetLambda <TEntity, bool>(obj, comparisionExpression); modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } return(modifiedQuery); }
/// <summary> /// Apply the given search. /// </summary> /// <param name="query">The base query where the search will apply.</param> /// <returns></returns> public IQueryable <TEntity> Apply(IQueryable <TEntity> query) { var validSearchTerms = GetValidSearchTerms().ToArray(); if (!validSearchTerms.Any()) { return(query); } var modifiedQuery = query; foreach (var searchTerm in validSearchTerms) { var propertyInfo = ExpressionHelper .GetPropertyInfo <TEntity>(searchTerm.EntityName ?? searchTerm.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 = searchTerm.ExpressionProvider.GetValue(searchTerm.Value); // x.Property == "Value" var comparisonExpression = searchTerm.ExpressionProvider .GetComparison(left, searchTerm.Operator, right); // x => x.Property == "Value" var lambdaExpression = ExpressionHelper .GetLambda <TEntity, bool>(obj, comparisonExpression); // query = query.Where... modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } return(modifiedQuery); }
public IQueryable <TEntity> Apply(IQueryable <TEntity> query) { if (_values == null || _values.Length == 0) { return(null); } var term = GetTermsFromModel().First(); if (term == null) { return(query); } var modifiedQuery = query; var propertyInfo = ExpressionHelper .GetPropertyInfo <TEntity>(term.EntityName ?? term.Name); var obj = ExpressionHelper.Parameter <TEntity>(); var left = ExpressionHelper.GetPropertyExpression(obj, propertyInfo); foreach (var value in _values) { // "Value" var right = term.ExpressionProvider.GetValue(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); }
// Need the query tracked using IQueryable 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.Name); var obj = ExpressionHelper.Parameter <TEntity>(); // Build 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 (now handles multiple operations) var compareExpression = term.ExpressionProvider.GetComparison(left, term.Operator, right); // x=>x.Property == Value var lambdaExpression = ExpressionHelper.GetLambda <TEntity, bool>(obj, compareExpression); // query = query.Where modifiedQuery = ExpressionHelper.CallWhere(modifiedQuery, lambdaExpression); } return(modifiedQuery); }