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); }
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)); }