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
{
///
/// The base Repository, it is meant to be inherited from by your custom custom MongoRepository implementation.
/// Its constructor must be given a connection string and a database name.
///
public abstract class ReadOnlyMongoRepository : ReadOnlyMongoRepository, IReadOnlyMongoRepository
{
///
/// The constructor taking a connection string and a database name.
///
/// The connection string of the MongoDb server.
/// The name of the database against which you want to perform operations.
protected ReadOnlyMongoRepository(string connectionString, string databaseName = null) : base(connectionString, databaseName)
{
}
///
/// The constructor taking a .
///
/// A mongodb context implementing
protected ReadOnlyMongoRepository(IMongoDbContext mongoDbContext) : base(mongoDbContext)
{
}
///
/// The constructor taking a .
///
/// A mongodb context implementing
protected ReadOnlyMongoRepository(IMongoDatabase mongoDatabase) : base(mongoDatabase)
{
}
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The type of the primary key.
/// The document.
///
public virtual IMongoCollection HandlePartitioned(TDocument document)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.HandlePartitioned(document);
}
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The type of the primary key.
/// The collection partition key.
///
public virtual IMongoCollection HandlePartitioned(string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
if (!string.IsNullOrEmpty(partitionKey))
{
return GetCollection(partitionKey);
}
return GetCollection();
}
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The document.
///
public virtual IMongoCollection HandlePartitioned(TDocument document)
where TDocument : IDocument
{
return MongoDbReader.HandlePartitioned(document);
}
///
/// Gets a collections for the type TDocument with a partition key.
///
/// The document type.
/// The type of the primary key.
/// The collection partition key.
///
public virtual IMongoCollection GetCollection(string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetCollection(partitionKey);
}
#region Read TKey
///
public virtual async Task GetByIdAsync(TKey id)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetByIdAsync(id, null, CancellationToken.None);
}
///
public virtual async Task GetByIdAsync(TKey id, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetByIdAsync(id, null, cancellationToken);
}
///
public virtual async Task GetByIdAsync(TKey id, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetByIdAsync(id, partitionKey, CancellationToken.None);
}
///
public virtual async Task GetByIdAsync(TKey id, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetByIdAsync(id, partitionKey, cancellationToken);
}
///
public virtual TDocument GetById(TKey id)
where TDocument : IDocument
where TKey : IEquatable
{
return GetById(id, null, CancellationToken.None);
}
///
public virtual TDocument GetById(TKey id, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return GetById(id, null, cancellationToken);
}
///
public virtual TDocument GetById(TKey id, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return GetById(id, partitionKey, CancellationToken.None);
}
///
public virtual TDocument GetById(TKey id, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetById(id, partitionKey, cancellationToken);
}
///
public Task GetOneAsync(FilterDefinition condition)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, null, null, CancellationToken.None);
}
///
public Task GetOneAsync(FilterDefinition condition, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, null, null, cancellationToken);
}
///
public Task GetOneAsync(FilterDefinition condition, FindOptions findOption)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, findOption, null, CancellationToken.None);
}
///
public Task GetOneAsync(FilterDefinition condition, string partitionKey)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, null, partitionKey, CancellationToken.None);
}
///
public Task GetOneAsync(FilterDefinition condition, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, null, partitionKey, cancellationToken);
}
///
public Task GetOneAsync(FilterDefinition condition, FindOptions findOption, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, findOption, null, cancellationToken);
}
///
public Task GetOneAsync(FilterDefinition condition, FindOptions findOption, string partitionKey)
where TDocument : IDocument where TKey : IEquatable
{
return GetOneAsync(condition, findOption, partitionKey, CancellationToken.None);
}
///
public Task GetOneAsync(
FilterDefinition condition,
FindOptions findOption,
string partitionKey,
CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return MongoDbReader.GetOneAsync(condition, findOption, partitionKey, cancellationToken);
}
///
public TDocument GetOne(FilterDefinition condition)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, null, null, CancellationToken.None);
}
///
public TDocument GetOne(FilterDefinition condition, FindOptions findOption)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, findOption, null, CancellationToken.None);
}
///
public TDocument GetOne(FilterDefinition condition, string partitionKey)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, null, partitionKey, CancellationToken.None);
}
///
public TDocument GetOne(FilterDefinition condition, FindOptions findOption, string partitionKey)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, findOption, partitionKey, CancellationToken.None);
}
///
public TDocument GetOne(FilterDefinition condition, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, null, null, cancellationToken);
}
///
public TDocument GetOne(FilterDefinition condition, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, null, partitionKey, cancellationToken);
}
///
public TDocument GetOne(FilterDefinition condition, FindOptions findOption, CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return GetOne(condition, findOption, null, cancellationToken);
}
///
public TDocument GetOne(
FilterDefinition condition,
FindOptions findOption,
string partitionKey,
CancellationToken cancellationToken)
where TDocument : IDocument where TKey : IEquatable
{
return MongoDbReader.GetOne(condition, findOption, partitionKey, cancellationToken);
}
///
public virtual async Task GetOneAsync(Expression> filter)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetOneAsync(filter, null, CancellationToken.None);
}
///
public virtual async Task GetOneAsync(Expression> filter, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetOneAsync(filter, partitionKey, CancellationToken.None);
}
///
public virtual async Task GetOneAsync(Expression> filter, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return await GetOneAsync(filter, null, cancellationToken);
}
///
public virtual async Task GetOneAsync(
Expression> filter,
string partitionKey,
CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetOneAsync(filter, partitionKey, cancellationToken);
}
///
public virtual TDocument GetOne(Expression> filter)
where TDocument : IDocument
where TKey : IEquatable
{
return GetOne(filter, null, CancellationToken.None);
}
///
public virtual TDocument GetOne(Expression> filter, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return GetOne(filter, partitionKey, CancellationToken.None);
}
///
public virtual TDocument GetOne(Expression> filter, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return GetOne(filter, null, cancellationToken);
}
///
public virtual TDocument GetOne(Expression> filter, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetOne(filter, partitionKey, cancellationToken);
}
///
public virtual IFindFluent GetCursor(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetCursor(filter, partitionKey);
}
///
public Task AnyAsync(FilterDefinition condition)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, null, null, CancellationToken.None);
}
///
public Task AnyAsync(FilterDefinition condition, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, null, partitionKey, CancellationToken.None);
}
///
public Task AnyAsync(FilterDefinition condition, CountOptions countOption)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, countOption, null, CancellationToken.None);
}
///
public Task AnyAsync(FilterDefinition condition, CountOptions countOption, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, countOption, partitionKey, CancellationToken.None);
}
///
public Task AnyAsync(FilterDefinition condition, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, null, null, cancellationToken);
}
///
public Task AnyAsync(FilterDefinition condition, string partitionKey, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, null, partitionKey, cancellationToken);
}
///
public Task AnyAsync(FilterDefinition condition, CountOptions countOption, CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return AnyAsync(condition, countOption, null, cancellationToken);
}
///
public Task AnyAsync(
FilterDefinition condition,
CountOptions countOption,
string partitionKey,
CancellationToken cancellationToken)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.AnyAsync(condition, countOption, partitionKey, cancellationToken);
}
///
public bool Any(FilterDefinition condition)
where TDocument : IDocument
where TKey : IEquatable
{
return Any(condition, null, null, CancellationToken.None);
}
///
public bool Any(FilterDefinition condition, string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
return Any(condition, null, partitionKey, CancellationToken.None);
}
///
public bool Any(FilterDefinition