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);
        }
Beispiel #2
0
        /// <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);
        }