コード例 #1
0
ファイル: DefaultQueryHandler.cs プロジェクト: andrei-mmn/PT
        public virtual IQueryable <TSourceData> ApplyOrdering(IQueryable <TSourceData> source, Query request)
        {
            if (request.Orderings == null)
            {
                return(source);
            }
            bool orderingPerformed = false;

            foreach (var ordering in request.Orderings)
            {
                if (ordering.Value == Ordering.Neutral)
                {
                    continue;
                }
                var srcOrderingExpr = _configuration.GetOrderingExpression(ordering.Key);
                if (srcOrderingExpr == null)
                {
                    continue;
                }

                if (ordering.Value == Ordering.Ascending)
                {
                    if (!orderingPerformed)
                    {
                        source            = ReflectionCache.CallOrderBy(source, srcOrderingExpr, srcOrderingExpr.Body.Type);
                        orderingPerformed = true;
                    }
                    else
                    {
                        source = ReflectionCache.CallThenBy(source, srcOrderingExpr, srcOrderingExpr.Body.Type);
                    }
                }
                if (ordering.Value == Ordering.Descending)
                {
                    if (!orderingPerformed)
                    {
                        source = ReflectionCache.CallOrderByDescending(source, srcOrderingExpr,
                                                                       srcOrderingExpr.Body.Type);
                        orderingPerformed = true;
                    }
                    else
                    {
                        source = ReflectionCache.CallThenByDescending(source, srcOrderingExpr,
                                                                      srcOrderingExpr.Body.Type);
                    }
                }
            }
            if (!orderingPerformed && _configuration.FallbackOrdering != null)
            {
                source = ReflectionCache.CallOrderByDescending(source, _configuration.FallbackOrdering, _configuration.FallbackOrdering.Body.Type);
            }
            return(source);
        }