using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Entities; namespace zero.Core.Extensions { public static class RavenQueryableExtensions { /// /// /// public static async Task> ToQueriedListAsync(this IRavenQueryable queryable, ListQuery query) { queryable = queryable.Statistics(out QueryStatistics stats); IQueryable rawQuery = queryable; if (query != null) { if (!query.Search.IsNullOrEmpty() && query.SearchSelector != null) { rawQuery = rawQuery.SearchIf(query.SearchSelector, query.Search, "*", "*", Raven.Client.Documents.Queries.SearchOperator.And); } if (!query.Search.IsNullOrEmpty() && query.SearchSelectors.Length > 0) { foreach (var selector in query.SearchSelectors) { rawQuery = rawQuery.SearchIf(selector, query.Search, "*", "*", Raven.Client.Documents.Queries.SearchOperator.And); } } if (query.OrderQuery != null) { rawQuery = query.OrderQuery(rawQuery); } else if (!query.OrderBy.IsNullOrEmpty()) { rawQuery = rawQuery.OrderBy(query.OrderBy, query.OrderIsDescending, query.OrderType == ListQueryOrderType.String ? OrderingType.String : OrderingType.Double); } if (query.PageSize > 0) { rawQuery = rawQuery.Paging(query.Page, query.PageSize); } } List items = await rawQuery.ToListAsync(); return new ListResult(items, stats.TotalResults, query.Page, query.PageSize); } /// /// /// public static async Task> ToQueriedListAsync(this IRavenQueryable queryable, ListQuery query) where TFilter : IListSpecificQuery { queryable = queryable.Statistics(out QueryStatistics stats); IQueryable rawQuery = queryable; if (query != null) { if (!query.Search.IsNullOrEmpty() && query.SearchSelector != null) { rawQuery = rawQuery.SearchIf(query.SearchSelector, query.Search, "*", "*"); } if (!query.Search.IsNullOrEmpty() && query.SearchSelectors.Length > 0) { foreach (var selector in query.SearchSelectors) { rawQuery = rawQuery.SearchIf(selector, query.Search, "*", "*", Raven.Client.Documents.Queries.SearchOperator.Or); } } if (!query.OrderBy.IsNullOrEmpty()) { rawQuery = rawQuery.OrderBy(query.OrderBy, query.OrderIsDescending, query.OrderType == ListQueryOrderType.String ? OrderingType.String : OrderingType.Double); } if (query.PageSize > 0) { rawQuery = rawQuery.Paging(query.Page, query.PageSize); } } List items = await rawQuery.ToListAsync(); return new ListResult(items, stats.TotalResults, query.Page, query.PageSize); } } }