using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; using MongoDbGenericRepository.Models; namespace MongoDbGenericRepository.DataAccess.Read { public partial class MongoDbReader { /// public virtual List GroupBy( Expression> groupingCriteria, Expression, TProjection>> groupProjection, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable where TProjection : class, new() { return HandlePartitioned(partitionKey) .Aggregate() .Group(groupingCriteria, groupProjection) .ToList(cancellationToken); } /// public virtual List GroupBy( Expression> filter, Expression> selector, Expression, TProjection>> projection, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable where TProjection : class, new() { var collection = HandlePartitioned(partitionKey); return collection.Aggregate() .Match(Builders.Filter.Where(filter)) .Group(selector, projection) .ToList(cancellationToken); } /// public virtual async Task> GroupByAsync( Expression> filter, Expression> selector, Expression, TProjection>> projection, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable where TProjection : class, new() { var collection = HandlePartitioned(partitionKey); return await collection.Aggregate() .Match(Builders.Filter.Where(filter)) .Group(selector, projection) .ToListAsync(cancellationToken); } /// public virtual async Task> GetSortedPaginatedAsync( Expression> filter, Expression> sortSelector, bool ascending = true, int skipNumber = 0, int takeNumber = 50, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable { var sorting = ascending ? Builders.Sort.Ascending(sortSelector) : Builders.Sort.Descending(sortSelector); return await HandlePartitioned(partitionKey) .Find(filter) .Sort(sorting) .Skip(skipNumber) .Limit(takeNumber) .ToListAsync(cancellationToken); } /// public virtual async Task> GetSortedPaginatedAsync( Expression> filter, SortDefinition sortDefinition, int skipNumber = 0, int takeNumber = 50, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable { return await HandlePartitioned(partitionKey) .Find(filter) .Sort(sortDefinition) .Skip(skipNumber) .Limit(takeNumber) .ToListAsync(cancellationToken); } } }