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