using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDbGenericRepository.DataAccess.Base;
using MongoDbGenericRepository.Models;
namespace MongoDbGenericRepository.DataAccess.Read
{
///
/// A class to read MongoDb document.
///
public partial class MongoDbReader : DataAccessBase, IMongoDbReader
{
///
/// The construct of the MongoDbReader class.
///
/// A instance.
public MongoDbReader(IMongoDbContext mongoDbContext) : base(mongoDbContext)
{
}
#region Read TKey
///
public virtual async Task GetByIdAsync(TKey id, string partitionKey = null, CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var filter = Builders.Filter.Eq("Id", id);
return await HandlePartitioned(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TDocument GetById(TKey id, string partitionKey = null, CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var filter = Builders.Filter.Eq("Id", id);
return HandlePartitioned(partitionKey).Find(filter).FirstOrDefault(cancellationToken);
}
///
public virtual Task GetOneAsync(
FilterDefinition condition,
FindOptions findOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(condition, findOption).FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TDocument GetOne(
FilterDefinition condition,
FindOptions findOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(condition, findOption).FirstOrDefault(cancellationToken);
}
///
public virtual async Task GetOneAsync(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await HandlePartitioned(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TDocument GetOne(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(filter).FirstOrDefault(cancellationToken);
}
///
public virtual IFindFluent GetCursor(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(filter);
}
///
public virtual async Task AnyAsync(
FilterDefinition condition,
CountOptions countOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var count = await HandlePartitioned(partitionKey).CountDocumentsAsync(condition, countOption, cancellationToken);
return count > 0;
}
///
public virtual bool Any(
FilterDefinition condition,
CountOptions countOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var count = HandlePartitioned(partitionKey).CountDocuments(condition, countOption, cancellationToken);
return count > 0;
}
///
public virtual async Task AnyAsync(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var count = await HandlePartitioned(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken);
return count > 0;
}
///
public virtual bool Any(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
var count = HandlePartitioned(partitionKey).CountDocuments(filter, cancellationToken: cancellationToken);
return count > 0;
}
///
public virtual Task> GetAllAsync(
FilterDefinition condition,
FindOptions findOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(condition, findOption).ToListAsync(cancellationToken);
}
///
public virtual List GetAll(
FilterDefinition condition,
FindOptions findOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(condition, findOption).ToList(cancellationToken);
}
///
public virtual async Task> GetAllAsync(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await HandlePartitioned(partitionKey).Find(filter).ToListAsync(cancellationToken);
}
///
public virtual List GetAll(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(filter).ToList(cancellationToken);
}
///
public virtual Task CountAsync(
FilterDefinition condition,
CountOptions countOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).CountDocumentsAsync(condition, countOption, cancellationToken);
}
///
public virtual long Count(
FilterDefinition condition,
CountOptions countOption = null,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).CountDocuments(condition, countOption, cancellationToken);
}
///
public virtual async Task CountAsync(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await HandlePartitioned(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken);
}
///
public virtual long Count(
Expression> filter,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return HandlePartitioned(partitionKey).Find(filter).CountDocuments(cancellationToken);
}
#endregion
#region Min / Max
///
public virtual async Task GetByMaxAsync(
Expression> filter,
Expression> maxValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetCollection(partitionKey).Find(Builders.Filter.Where(filter))
.SortByDescending(maxValueSelector)
.Limit(1)
.FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TDocument GetByMax(
Expression> filter,
Expression> maxValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return GetCollection(partitionKey).Find(Builders.Filter.Where(filter))
.SortByDescending(maxValueSelector)
.Limit(1)
.FirstOrDefault(cancellationToken);
}
///
public virtual async Task GetByMinAsync(
Expression> filter,
Expression> minValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetCollection(partitionKey).Find(Builders.Filter.Where(filter))
.SortBy(minValueSelector)
.Limit(1)
.FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TDocument GetByMin(
Expression> filter,
Expression> minValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return GetCollection(partitionKey).Find(Builders.Filter.Where(filter))
.SortBy(minValueSelector)
.Limit(1)
.FirstOrDefault(cancellationToken);
}
///
public virtual async Task GetMaxValueAsync(
Expression> filter,
Expression> maxValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetMaxMongoQuery(filter, maxValueSelector, partitionKey)
.Project(maxValueSelector)
.FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TValue GetMaxValue(
Expression> filter,
Expression> maxValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return GetMaxMongoQuery(filter, maxValueSelector, partitionKey)
.Project(maxValueSelector)
.FirstOrDefault(cancellationToken);
}
///
public virtual async Task GetMinValueAsync(
Expression> filter,
Expression> minValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetMinMongoQuery(filter, minValueSelector, partitionKey).Project(minValueSelector)
.FirstOrDefaultAsync(cancellationToken);
}
///
public virtual TValue GetMinValue(
Expression> filter,
Expression> minValueSelector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return GetMinMongoQuery(filter, minValueSelector, partitionKey).Project(minValueSelector)
.FirstOrDefault(cancellationToken);
}
#endregion Min / Max
#region Sum TKey
///
public virtual async Task SumByAsync(
Expression> filter,
Expression> selector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetQuery(filter, partitionKey).SumAsync(selector, cancellationToken);
}
///
public virtual int SumBy(
Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return GetQuery(filter, partitionKey).Sum(selector);
}
///
public virtual async Task SumByAsync(
Expression> filter,
Expression> selector,
string partitionKey = null,
CancellationToken cancellationToken = default)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetQuery(filter, partitionKey).SumAsync(selector, cancellationToken);
}
///
public virtual decimal SumBy(
Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return GetQuery(filter, partitionKey).Sum(selector);
}
#endregion Sum TKey
}
}