diff --git a/MongoDbGenericRepository/BaseMongoDbRepository.cs b/MongoDbGenericRepository/BaseMongoDbRepository.cs
index 48ed66f..c3b1517 100644
--- a/MongoDbGenericRepository/BaseMongoDbRepository.cs
+++ b/MongoDbGenericRepository/BaseMongoDbRepository.cs
@@ -5,888 +5,24 @@ using System.Threading.Tasks;
using System.Linq.Expressions;
using MongoDbGenericRepository.Models;
using System.Linq;
+using MongoDbGenericRepository.Utils;
namespace MongoDbGenericRepository
{
- ///
- /// The IBaseMongoRepository exposes the functionality of the BaseMongoRepository.
- ///
- public interface IBaseMongoRepository
- {
- ///
- /// The connection string.
- ///
- string ConnectionString { get; set; }
- ///
- /// The database name.
- ///
- string DatabaseName { get; set; }
-
- #region Create
-
- ///
- /// Asynchronously adds a document to the collection.
- ///
- /// The type representing a Document.
- /// The document you want to add.
- Task AddOneAsync(TDocument document) where TDocument : IDocument;
-
- ///
- /// Adds a document to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The document you want to add.
- void AddOne(TDocument document) where TDocument : IDocument;
-
- ///
- /// Asynchronously adds a list of documents to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The document you want to add.
- Task AddManyAsync(IEnumerable documents) where TDocument : IDocument;
-
- ///
- /// Adds a list of documents to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The document you want to add.
- void AddMany(IEnumerable documents) where TDocument : IDocument;
-
- #endregion
-
- #region Create TKey
-
- ///
- /// Asynchronously adds a document to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to add.
- Task AddOneAsync(TDocument document)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Adds a document to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to add.
- void AddOne(TDocument document)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously adds a list of documents to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The documents you want to add.
- Task AddManyAsync(IEnumerable documents)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Adds a list of documents to the collection.
- /// Populates the Id and AddedAtUtc fields if necessary.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The documents you want to add.
- void AddMany(IEnumerable documents)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- #endregion
-
- #region Read
-
- ///
- /// Asynchronously returns one document given its id.
- ///
- /// The type representing a Document.
- /// The Id of the document you want to get.
- /// An optional partition key.
- Task GetByIdAsync(Guid id, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Returns one document given its id.
- ///
- /// The type representing a Document.
- /// The Id of the document you want to get.
- /// An optional partition key.
- TDocument GetById(Guid id, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously returns one document given an expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task GetOneAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Returns one document given an expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- TDocument GetOne(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Returns a collection cursor.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- IFindFluent GetCursor(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously returns true if any of the document of the collection matches the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task AnyAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Returns true if any of the document of the collection matches the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- bool Any(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously returns a list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task> GetAllAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Returns a list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- List GetAll(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously counts how many documents match the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task CountAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Counts how many documents match the filter condition.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- long Count(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- #endregion
-
- #region Read TKey
-
- ///
- /// Asynchronously returns one document given its id.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The Id of the document you want to get.
- /// An optional partition key.
- Task GetByIdAsync(TKey id, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Returns one document given its id.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The Id of the document you want to get.
- /// An optional partition key.
- TDocument GetById(TKey id, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously returns one document given an expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task GetOneAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Returns one document given an expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- TDocument GetOne(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
-
- ///
- /// Returns a collection cursor.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- IFindFluent GetCursor(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
-
- ///
- /// Returns true if any of the document of the collection matches the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task AnyAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Returns true if any of the document of the collection matches the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- bool Any(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously returns a list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- Task> GetAllAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Returns a list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- List GetAll(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously counts how many documents match the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partitionKey
- Task CountAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Counts how many documents match the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partitionKey
- long Count(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- #endregion
-
- #region Update
-
- ///
- /// Asynchronously Updates a document.
- ///
- /// The type representing a Document.
- /// The document with the modifications you want to persist.
- Task UpdateOneAsync(TDocument modifiedDocument) where TDocument : IDocument;
-
- ///
- /// Updates a document.
- ///
- /// The type representing a Document.
- /// The document with the modifications you want to persist.
- bool UpdateOne(TDocument modifiedDocument) where TDocument : IDocument;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the field.
- /// The document filter.
- /// The field selector.
- /// The new value of the property field.
- bool UpdateOne(FilterDefinition filter, Expression> field, TField value, string partitionKey = null)
- where TDocument : IDocument;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the field.
- /// The document filter.
- /// The field selector.
- /// The new value of the property field.
- Task UpdateOneAsync(FilterDefinition filter, Expression> field, TField value, string partitionKey = null)
- where TDocument : IDocument;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the field.
- /// The document you want to modify.
- /// The field selector.
- /// The new value of the property field.
- bool UpdateOne(TDocument documentToModify, Expression> field, TField value)
- where TDocument : IDocument;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the field.
- /// The document you want to modify.
- /// The field selector.
- /// The new value of the property field.
- Task UpdateOneAsync(TDocument documentToModify, Expression> field, TField value)
- where TDocument : IDocument;
-
- ///
- /// Takes a document you want to modify and applies the update you have defined in MongoDb.
- ///
- /// The type representing a Document.
- /// The document you want to modify.
- /// The update definition for the document.
- Task UpdateOneAsync(TDocument documentToModify, UpdateDefinition update)
- where TDocument : IDocument;
-
- ///
- /// Takes a document you want to modify and applies the update you have defined in MongoDb.
- ///
- /// The type representing a Document.
- /// The document you want to modify.
- /// The update definition for the document.
- bool UpdateOne(TDocument documentToModify, UpdateDefinition update)
- where TDocument : IDocument;
-
- #endregion
-
- #region Update TKey
-
- ///
- /// Asynchronously Updates a document.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document with the modifications you want to persist.
- Task UpdateOneAsync(TDocument modifiedDocument)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Updates a document.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document with the modifications you want to persist.
- bool UpdateOne(TDocument modifiedDocument)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Takes a document you want to modify and applies the update you have defined in MongoDb.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to modify.
- /// The update definition for the document.
- Task UpdateOneAsync(TDocument documentToModify, UpdateDefinition update)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Takes a document you want to modify and applies the update you have defined in MongoDb.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to modify.
- /// The update definition for the document.
- bool UpdateOne(TDocument documentToModify, UpdateDefinition update)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type of the field.
- /// The document you want to modify.
- /// The field selector.
- /// The new value of the property field.
- Task UpdateOneAsync(TDocument documentToModify, Expression> field, TField value)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type of the field.
- /// The document you want to modify.
- /// The field selector.
- /// The new value of the property field.
- bool UpdateOne(TDocument documentToModify, Expression> field, TField value)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type of the field.
- /// The document filter.
- /// The field selector.
- /// The new value of the property field.
- Task UpdateOneAsync(FilterDefinition filter, Expression> field, TField value, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Updates the property field with the given value update a property field in entities.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type of the field.
- /// The document filter.
- /// The field selector.
- /// The new value of the property field.
- bool UpdateOne(FilterDefinition filter, Expression> field, TField value, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- #endregion
-
- #region Delete
-
- ///
- /// Asynchronously deletes a document.
- ///
- /// The type representing a Document.
- /// The document you want to delete.
- /// The number of documents deleted.
- Task DeleteOneAsync(TDocument document) where TDocument : IDocument;
-
- ///
- /// Asynchronously deletes a document matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- Task DeleteOneAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Deletes a document.
- ///
- /// The type representing a Document.
- /// The document you want to delete.
- /// The number of documents deleted.
- long DeleteOne(TDocument document) where TDocument : IDocument;
-
- ///
- /// Deletes a document matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- long DeleteOne(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously deletes the documents matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- Task DeleteManyAsync(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- ///
- /// Asynchronously deletes a list of documents.
- ///
- /// The type representing a Document.
- /// The list of documents to delete.
- /// The number of documents deleted.
- Task DeleteManyAsync(IEnumerable documents) where TDocument : IDocument;
-
- ///
- /// Deletes a list of documents.
- ///
- /// The type representing a Document.
- /// The list of documents to delete.
- /// The number of documents deleted.
- long DeleteMany(IEnumerable documents) where TDocument : IDocument;
-
- ///
- /// Deletes the documents matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- long DeleteMany(Expression> filter, string partitionKey = null) where TDocument : IDocument;
-
- #endregion
-
- #region Delete TKey
-
- ///
- /// Deletes a document.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to delete.
- /// The number of documents deleted.
- long DeleteOne(TDocument document)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously deletes a document matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The document you want to delete.
- /// The number of documents deleted.
- Task DeleteOneAsync(TDocument document)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Deletes a document matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- long DeleteOne(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously deletes a document matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- Task DeleteOneAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously deletes the documents matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- Task DeleteManyAsync(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Asynchronously deletes a list of documents.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The list of documents to delete.
- /// The number of documents deleted.
- Task DeleteManyAsync(IEnumerable documents)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Deletes a list of documents.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The list of documents to delete.
- /// The number of documents deleted.
- long DeleteMany(IEnumerable documents)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// Deletes the documents matching the condition of the LINQ expression filter.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// A LINQ expression filter.
- /// An optional partition key.
- /// The number of documents deleted.
- long DeleteMany(Expression> filter, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- #endregion
-
- #region Project
-
- ///
- /// Asynchronously returns a projected document matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- Task ProjectOneAsync(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TProjection : class;
-
- ///
- /// Asynchronously returns a projected document matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- Task ProjectOneAsync(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable
- where TProjection : class;
-
- ///
- /// Returns a projected document matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- TProjection ProjectOne(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TProjection : class;
-
- ///
- /// Returns a projected document matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- TProjection ProjectOne(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable
- where TProjection : class;
-
- ///
- /// Asynchronously returns a list of projected documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- Task> ProjectManyAsync(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TProjection : class;
-
- ///
- /// Asynchronously returns a list of projected documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- Task> ProjectManyAsync(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable
- where TProjection : class;
-
- ///
- /// Asynchronously returns a list of projected documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- List ProjectMany(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TProjection : class;
-
- ///
- /// Asynchronously returns a list of projected documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- /// The type representing the model you want to project to.
- ///
- /// The projection expression.
- /// An optional partition key.
- List ProjectMany(Expression> filter, Expression> projection, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable
- where TProjection : class;
-
- #endregion
-
- ///
- /// Asynchronously returns a paginated list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- ///
- /// The number of documents you want to skip. Default value is 0.
- /// The number of documents you want to take. Default value is 50.
- /// An optional partition key.
- Task> GetPaginatedAsync(Expression> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
- where TDocument : IDocument;
-
- ///
- /// Asynchronously returns a paginated list of the documents matching the filter condition.
- ///
- /// The type representing a Document.
- /// The type of the primary key for a Document.
- ///
- /// The number of documents you want to skip. Default value is 0.
- /// The number of documents you want to take. Default value is 50.
- /// An optional partition key.
- Task> GetPaginatedAsync(Expression> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
- where TDocument : IDocument
- where TKey : IEquatable;
-
- ///
- /// GetAndUpdateOne with filter
- ///
- /// The type representing a Document.
- ///
- ///
- ///
- ///
- Task GetAndUpdateOne(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions