예제 #1
0
        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);
        }
예제 #2
0
        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);
        }