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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        // 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);
        }