public static IDocumentFindCursor ToSortedCursor(this IDocumentFindCursor documentFindCursor, IEnumerable <SortingCriteria> sort)
        {
            var result = documentFindCursor;

            if (sort != null)
            {
                IDocumentFindSortedCursor sortedCursor = null;

                foreach (var criteria in sort)
                {
                    if (string.Equals(criteria.SortingOrder, "ascending", StringComparison.OrdinalIgnoreCase))
                    {
                        if (sortedCursor == null)
                        {
                            sortedCursor = result.SortBy(criteria.PropertyName);
                            result       = sortedCursor;
                        }
                        else
                        {
                            sortedCursor = sortedCursor.ThenBy(criteria.PropertyName);
                            result       = sortedCursor;
                        }
                    }
                    else if (string.Equals(criteria.SortingOrder, "descending", StringComparison.OrdinalIgnoreCase))
                    {
                        if (sortedCursor == null)
                        {
                            sortedCursor = result.SortByDescending(criteria.PropertyName);
                            result       = sortedCursor;
                        }
                        else
                        {
                            sortedCursor = sortedCursor.ThenByDescending(criteria.PropertyName);
                            result       = sortedCursor;
                        }
                    }
                }
            }

            return(result);
        }
예제 #2
0
        protected override Task <object> Get(IHttpRequest request)
        {
            return(ProcessRequestAsync(request,
                                       r => _queryFactory.CreateGetQuery(r),
                                       async query =>
            {
                // Установка фильтра
                var cursor = string.IsNullOrWhiteSpace(query.Search)
                        ? _storage.Find(query.Filter)
                        : _storage.FindText(query.Search, filter: query.Filter);

                // Установка правил сортировки
                if (query.Order != null)
                {
                    IDocumentFindSortedCursor <TDocument, TDocument> sortedCursor = null;

                    foreach (var order in query.Order)
                    {
                        switch (order.Value)
                        {
                        case DocumentSortOrder.Asc:
                            cursor = sortedCursor = (sortedCursor == null)
                                        ? cursor.SortBy(order.Key)
                                        : sortedCursor.ThenBy(order.Key);
                            break;

                        case DocumentSortOrder.Desc:
                            cursor = sortedCursor = (sortedCursor == null)
                                        ? cursor.SortByDescending(order.Key)
                                        : sortedCursor.ThenByDescending(order.Key);
                            break;
                        }
                    }
                }

                // Установки диапазона выборки
                cursor = cursor.Skip(query.Skip).Limit(query.Take);

                IEnumerable <object> items;

                if (query.Select == null)
                {
                    // Выборка документов
                    items = await cursor.ToListAsync();
                }
                else
                {
                    // Выборка проекции документов
                    items = await cursor.Project(query.Select).ToListAsync();
                }

                long?count = null;

                if (query.Count)
                {
                    // Подсчет общего количества документов по фильтру
                    count = await cursor.CountAsync();
                }

                return new DocumentGetQueryResult {
                    Items = items, Count = count
                };
            },
                                       _serviceHandler.OnBeforeGet,
                                       _serviceHandler.OnAfterGet));
        }