diff --git a/CoreIntegrationTests/CoreIntegrationTests.csproj b/CoreIntegrationTests/CoreIntegrationTests.csproj index 69f6379..b89f770 100644 --- a/CoreIntegrationTests/CoreIntegrationTests.csproj +++ b/CoreIntegrationTests/CoreIntegrationTests.csproj @@ -7,8 +7,8 @@ <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.2" /> <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.1.2" /> - <PackageReference Include="MongoDB.Driver" Version="2.9.3" /> - <PackageReference Include="MongoDbGenericRepository" Version="1.4.5" /> + <PackageReference Include="MongoDB.Driver" Version="2.12.0" /> + <PackageReference Include="MongoDbGenericRepository" Version="1.4.6" /> <PackageReference Include="xunit" Version="2.4.1" /> <PackageReference Include="xunit.runner.console" Version="2.4.1"> <PrivateAssets>all</PrivateAssets> diff --git a/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs b/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs index ddd8ff9..fba2045 100644 --- a/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs +++ b/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs @@ -796,7 +796,7 @@ public async Task GetMinValueAsync() #region Index Management - static SemaphoreSlim textIndexSemaphore = new SemaphoreSlim(1, 1); + static readonly SemaphoreSlim textIndexSemaphore = new SemaphoreSlim(1, 1); [Fact] public async Task CreateTextIndexNoOptionAsync() diff --git a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs index d30bc5c..86ec936 100644 --- a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs +++ b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs @@ -6,6 +6,9 @@ namespace MongoDbGenericRepository { + /// <summary> + /// The IBaseMongoRepository_Update interface exposing update functionality for documents with Guid Ids. + /// </summary> public interface IBaseMongoRepository_Update : IBaseMongoRepository_Update<Guid> { /// <summary> diff --git a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs index 8ed2e1e..9e9223b 100644 --- a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs +++ b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs @@ -7,6 +7,9 @@ namespace MongoDbGenericRepository.DataAccess.Update { + /// <summary> + /// The IBaseMongoRepository_Update_ClientSession interface exposing update functionality with a IClientSessionHandle. + /// </summary> public interface IBaseMongoRepository_Update_ClientSession { /// <summary> @@ -14,10 +17,14 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> + /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> - /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> + /// <param name="filter">The filter for the update.</param> + /// <param name="field">The field to update.</param> + /// <param name="value">The value of the field.</param> + /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -27,10 +34,14 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> + /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> - /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> + /// <param name="filter">The filter for the update.</param> + /// <param name="field">The field to update.</param> + /// <param name="value">The value of the field.</param> + /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -40,11 +51,13 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> + /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> /// <param name="documentToModify">The document to modify.</param> - /// <param name="update">The update definition.</param> + /// <param name="field">The field to update.</param> + /// <param name="value">The value of the field.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -55,10 +68,9 @@ public interface IBaseMongoRepository_Update_ClientSession /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="session">The client session.</param> - /// <param name="documentToModify">The document to modify.</param> - /// <param name="update">The update definition.</param> + /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -68,13 +80,11 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> - /// <typeparam name="TField">The type of the field to update.</typeparam> - /// <param name="session">The client session.</param> + /// <param name="session">The client session.</param> /// <param name="documentToModify">The document to modify.</param> - /// <param name="field">The field to update.</param> - /// <param name="value">The value of the field.</param> + /// <param name="update">The update definition.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -86,11 +96,12 @@ public interface IBaseMongoRepository_Update_ClientSession /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> - /// <param name="documentToModify">The document to modify.</param> + /// <param name="filter">The filter for the update.</param> /// <param name="field">The field to update.</param> /// <param name="value">The value of the field.</param> + /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -118,13 +129,12 @@ public interface IBaseMongoRepository_Update_ClientSession /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <typeparam name="TField">The type of the field to update.</typeparam> - /// <param name="session">The client session.</param> - /// <param name="filter">The filter for the update.</param> + /// <param name="session">The client session.</param> + /// <param name="documentToModify">The document to modify.</param> /// <param name="field">The field to update.</param> /// <param name="value">The value of the field.</param> - /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -134,14 +144,10 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> - /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> - /// <param name="filter">The filter for the update.</param> - /// <param name="field">The field to update.</param> - /// <param name="value">The value of the field.</param> - /// <param name="partitionKey">The optional partition key.</param> + /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -151,14 +157,11 @@ public interface IBaseMongoRepository_Update_ClientSession /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> - /// <typeparam name="TField">The type of the field to update.</typeparam> /// <param name="session">The client session.</param> - /// <param name="filter">The filter for the update.</param> - /// <param name="field">The field to update.</param> - /// <param name="value">The value of the field.</param> - /// <param name="partitionKey">The optional partition key.</param> + /// <param name="documentToModify">The document to modify.</param> + /// <param name="update">The update definition.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; diff --git a/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs b/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs index 1c4866d..304607f 100644 --- a/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs +++ b/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository @@ -32,7 +33,8 @@ public interface IBaseReadOnlyRepository /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="id">The Id of the document you want to get.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -54,7 +56,8 @@ TDocument GetById<TDocument, TKey>(TKey id, string partitionKey = null) /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -88,7 +91,8 @@ IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expression<Func<TDo /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -110,7 +114,8 @@ bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string parti /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -132,7 +137,8 @@ List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument, bool>> filter /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partitionKey</param> - Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -157,9 +163,13 @@ long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string par /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByDescending">A property selector to order by descending.</param> + /// <param name="maxValueSelector">A property selector to order by descending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TDocument> GetByMaxAsync<TDocument, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, object>> maxValueSelector, + string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -181,9 +191,13 @@ TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Ex /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByAscending">A property selector to order by ascending.</param> + /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> - Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, object>> minValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -193,9 +207,9 @@ Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByAscending">A property selector to order by ascending.</param> + /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> - TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null) + TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -206,9 +220,14 @@ TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Ex /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <typeparam name="TValue">The type of the value used to order the query.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByAscending">A property selector to order by ascending.</param> + /// <param name="maxValueSelector">A property selector for the maximum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> - Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> orderByAscending, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TValue>> maxValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -219,9 +238,9 @@ Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <typeparam name="TValue">The type of the value used to order the query.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByDescending">A property selector to order by ascending.</param> + /// <param name="maxValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> orderByDescending, string partitionKey = null) + TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -234,7 +253,12 @@ TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> fi /// <param name="filter">A LINQ expression filter.</param> /// <param name="minValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TValue>> minValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -263,9 +287,11 @@ TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> fi /// <param name="filter">A LINQ expression filter.</param> /// <param name="selector">The field you want to sum.</param> /// <param name="partitionKey">The partition key of your document, if any.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, int>> selector, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -321,10 +347,15 @@ decimal SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <typeparam name="TProjection">The type representing the model you want to project to.</typeparam> - /// <param name="filter"></param> + /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> where TProjection : class; @@ -349,13 +380,18 @@ TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<Func<TDocument, /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <typeparam name="TProjection">The type representing the model you want to project to.</typeparam> - /// <param name="filter"></param> + /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) - where TDocument : IDocument<TKey> - where TKey : IEquatable<TKey> - where TProjection : class; + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) + where TDocument : IDocument<TKey> + where TKey : IEquatable<TKey> + where TProjection : class; /// <summary> /// Asynchronously returns a list of projected documents matching the filter condition. @@ -450,12 +486,14 @@ Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>( /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param> /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param> /// <param name="partitionKey">An optional partition key.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>( Expression<Func<TDocument, bool>> filter, SortDefinition<TDocument> sortDefinition, int skipNumber = 0, int takeNumber = 50, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; diff --git a/MongoDbGenericRepository/BaseMongoRepository.Create.cs b/MongoDbGenericRepository/BaseMongoRepository.Create.cs index d2b319e..70d20e5 100644 --- a/MongoDbGenericRepository/BaseMongoRepository.Create.cs +++ b/MongoDbGenericRepository/BaseMongoRepository.Create.cs @@ -2,10 +2,15 @@ using MongoDbGenericRepository.Models; using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository { + /// <summary> + /// The IBaseMongoRepository_Create interface to expose document creation functionality + /// with document having an Id of type Guid. + /// </summary> public interface IBaseMongoRepository_Create : IBaseMongoRepository_Create<Guid> { /// <summary> @@ -15,7 +20,8 @@ public interface IBaseMongoRepository_Create : IBaseMongoRepository_Create<Guid> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="document">The document you want to add.</param> - Task AddOneAsync<TDocument, TKey>(TDocument document) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -37,7 +43,8 @@ void AddOne<TDocument, TKey>(TDocument document) /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents) + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey>; @@ -61,6 +68,10 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Create { private readonly object _initLock = new object(); private MongoDbCreator _mongoDbCreator; + + /// <summary> + /// The MongoDbCreator field. + /// </summary> protected virtual MongoDbCreator MongoDbCreator { get @@ -87,11 +98,12 @@ protected virtual MongoDbCreator MongoDbCreator /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="document">The document you want to add.</param> - public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - await MongoDbCreator.AddOneAsync<TDocument, TKey>(document); + await MongoDbCreator.AddOneAsync<TDocument, TKey>(document, cancellationToken); } /// <summary> @@ -100,10 +112,11 @@ public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document) /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="document">The document you want to add.</param> - public virtual async Task AddOneAsync<TDocument>(TDocument document) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<Guid> { - await MongoDbCreator.AddOneAsync<TDocument, Guid>(document); + await MongoDbCreator.AddOneAsync<TDocument, Guid>(document, cancellationToken); } /// <summary> @@ -138,11 +151,12 @@ public virtual void AddOne<TDocument>(TDocument document) where TDocument : IDoc /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents); + await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents, cancellationToken); } /// <summary> @@ -151,10 +165,11 @@ public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> d /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<Guid> { - await MongoDbCreator.AddManyAsync<TDocument, Guid>(documents); + await MongoDbCreator.AddManyAsync<TDocument, Guid>(documents, cancellationToken); } /// <summary> diff --git a/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs b/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs index 86d3b9b..aa661b0 100644 --- a/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs +++ b/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs @@ -18,7 +18,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="session">The client session.</param> /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -34,7 +34,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="session">The client session.</param> /// <param name="modifiedDocument">The document with the modifications you want to persist.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -51,7 +51,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="documentToModify">The document to modify.</param> /// <param name="update">The update definition.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -68,7 +68,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="documentToModify">The document to modify.</param> /// <param name="update">The update definition.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -87,7 +87,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="field">The field to update.</param> /// <param name="value">The value of the field.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -106,7 +106,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="field">The field to update.</param> /// <param name="value">The value of the field.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -126,7 +126,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="value">The value of the field.</param> /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -146,7 +146,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="value">The value of the field.</param> /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -166,7 +166,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="value">The value of the field.</param> /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -186,7 +186,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_ /// <param name="value">The value of the field.</param> /// <param name="partitionKey">The optional partition key.</param> /// <param name="cancellationToken">The optional cancellation token.</param> - /// <returns></returns> + /// <returns>A boolean value indicating success.</returns> public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken)) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> diff --git a/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs b/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs index f7a4949..eded8d5 100644 --- a/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs +++ b/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs @@ -7,10 +7,20 @@ namespace MongoDbGenericRepository.DataAccess.Base { + /// <summary> + /// A base class for accessing the Database and its Collections. + /// </summary> public class DataAccessBase { + /// <summary> + /// The MongoDbContext + /// </summary> protected IMongoDbContext MongoDbContext; + /// <summary> + /// The constructor of the DataAccessBase class + /// </summary> + /// <param name="mongoDbContext"></param> public DataAccessBase(IMongoDbContext mongoDbContext) { MongoDbContext = mongoDbContext; @@ -18,6 +28,14 @@ public DataAccessBase(IMongoDbContext mongoDbContext) #region Utility Methods + /// <summary> + /// Gets a IMongoQueryable for a potentially partitioned document type and a filter. + /// </summary> + /// <typeparam name="TDocument">The document type.</typeparam> + /// <typeparam name="TKey">The type of the primary key.</typeparam> + /// <param name="filter">The filter definition.</param> + /// <param name="partitionKey">The collection partition key.</param> + /// <returns></returns> public virtual IMongoQueryable<TDocument> GetQuery<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> @@ -108,7 +126,6 @@ protected virtual CreateIndexOptions MapIndexOptions(IndexCreationOptions indexC LanguageOverride = indexCreationOptions.LanguageOverride, ExpireAfter = indexCreationOptions.ExpireAfter, DefaultLanguage = indexCreationOptions.DefaultLanguage, - BucketSize = indexCreationOptions.BucketSize, Bits = indexCreationOptions.Bits, Background = indexCreationOptions.Background, Version = indexCreationOptions.Version diff --git a/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs b/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs index bc490c7..7847030 100644 --- a/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs +++ b/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs @@ -6,12 +6,20 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository.DataAccess.Create { + /// <summary> + /// A class to insert MongoDb document. + /// </summary> public class MongoDbCreator : DataAccessBase { + /// <summary> + /// The construct of the MongoDbCreator class. + /// </summary> + /// <param name="mongoDbContext">A <see cref="IMongoDbContext"/> instance.</param> public MongoDbCreator(IMongoDbContext mongoDbContext) : base(mongoDbContext) { } @@ -25,12 +33,13 @@ public MongoDbCreator(IMongoDbContext mongoDbContext) : base(mongoDbContext) /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="document">The document you want to add.</param> - public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { FormatDocument<TDocument, TKey>(document); - await HandlePartitioned<TDocument, TKey>(document).InsertOneAsync(document); + await HandlePartitioned<TDocument, TKey>(document).InsertOneAsync(document, null, cancellationToken); } /// <summary> @@ -55,7 +64,8 @@ public virtual void AddOne<TDocument, TKey>(TDocument document) /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { @@ -72,12 +82,12 @@ public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> d { foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey)) { - await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertManyAsync(group.ToList()); + await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertManyAsync(group.ToList(), null, cancellationToken); } } else { - await GetCollection<TDocument, TKey>().InsertManyAsync(documents.ToList()); + await GetCollection<TDocument, TKey>().InsertManyAsync(documents.ToList(), null, cancellationToken); } } diff --git a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs index b07dc0f..832b4ae 100644 --- a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs +++ b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs @@ -6,12 +6,20 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository.DataAccess.Read { + /// <summary> + /// A class to read MongoDb document. + /// </summary> public partial class MongoDbReader : DataAccessBase { + /// <summary> + /// The construct of the MongoDbReader class. + /// </summary> + /// <param name="mongoDbContext">A <see cref="IMongoDbContext"/> instance.</param> public MongoDbReader(IMongoDbContext mongoDbContext) : base(mongoDbContext) { } @@ -25,12 +33,13 @@ public MongoDbReader(IMongoDbContext mongoDbContext) : base(mongoDbContext) /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="id">The Id of the document you want to get.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { var filter = Builders<TDocument>.Filter.Eq("Id", id); - return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(); + return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -55,11 +64,12 @@ public virtual TDocument GetById<TDocument, TKey>(TKey id, string partitionKey = /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(); + return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -97,11 +107,12 @@ public virtual IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expr /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter); + var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken); return (count > 0); } @@ -127,11 +138,12 @@ public virtual bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filte /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).ToListAsync(); + return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).ToListAsync(cancellationToken); } /// <summary> @@ -155,11 +167,12 @@ public virtual List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partitionKey</param> - public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter); + return await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken); } /// <summary> @@ -188,14 +201,15 @@ public virtual long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> fil /// <param name="filter">A LINQ expression filter.</param> /// <param name="maxValueSelector">A property selector to order by descending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter)) .SortByDescending(maxValueSelector) .Limit(1) - .FirstOrDefaultAsync(); + .FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -224,14 +238,15 @@ public virtual TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bo /// <param name="filter">A LINQ expression filter.</param> /// <param name="minValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter)) .SortBy(minValueSelector) .Limit(1) - .FirstOrDefaultAsync(); + .FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -257,16 +272,18 @@ public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bo /// </summary> /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> + /// <typeparam name="TValue">The type of the field for which you want the maximum value.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="orderByAscending">A property selector to order by ascending.</param> + /// <param name="maxValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { return await GetMaxMongoQuery<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey) .Project(maxValueSelector) - .FirstOrDefaultAsync(); + .FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -296,11 +313,12 @@ public virtual TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocu /// <param name="filter">A LINQ expression filter.</param> /// <param name="minValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefaultAsync(); + return await GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -332,13 +350,15 @@ public virtual TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocu /// <param name="filter">A LINQ expression filter.</param> /// <param name="selector">The field you want to sum.</param> /// <param name="partitionKey">The partition key of your document, if any.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, int>> selector, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector); + return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector, cancellationToken); } /// <summary> @@ -366,13 +386,14 @@ public virtual int SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>> filt /// <param name="filter">A LINQ expression filter.</param> /// <param name="selector">The field you want to sum.</param> /// <param name="partitionKey">The partition key of your document, if any.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<decimal> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, decimal>> selector, - string partitionKey = null) + string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector); + return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector, cancellationToken); } /// <summary> @@ -451,6 +472,36 @@ public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection, TKey .ToList(); } + /// <summary> + /// Groups filtered a collection of documents given a grouping criteria, + /// and returns a dictionary of listed document groups with keys having the different values of the grouping criteria. + /// </summary> + /// <typeparam name="TDocument">The type representing a Document.</typeparam> + /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> + /// <typeparam name="TGroupKey">The type of the grouping criteria.</typeparam> + /// <typeparam name="TProjection">The type of the projected group.</typeparam> + /// <param name="filter">A LINQ expression filter.</param> + /// <param name="selector">The grouping criteria.</param> + /// <param name="projection">The projected group result.</param> + /// <param name="partitionKey">The partition key of your document, if any.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<List<TProjection>> GroupByAsync<TDocument, TGroupKey, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TGroupKey>> selector, + Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) + where TDocument : IDocument<TKey> + where TKey : IEquatable<TKey> + where TProjection : class, new() + { + var collection = HandlePartitioned<TDocument, TKey>(partitionKey); + return await collection.Aggregate() + .Match(Builders<TDocument>.Filter.Where(filter)) + .Group(selector, projection) + .ToListAsync(cancellationToken); + } + /// <summary> /// Asynchronously returns a paginated list of the documents matching the filter condition. /// </summary> @@ -462,13 +513,15 @@ public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection, TKey /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param> /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param> /// <param name="partitionKey">An optional partition key.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>( Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> sortSelector, bool ascending = true, int skipNumber = 0, int takeNumber = 50, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { @@ -481,7 +534,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK .Sort(sorting) .Skip(skipNumber) .Limit(takeNumber) - .ToListAsync(); + .ToListAsync(cancellationToken); } /// <summary> @@ -494,12 +547,14 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param> /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param> /// <param name="partitionKey">An optional partition key.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>( Expression<Func<TDocument, bool>> filter, SortDefinition<TDocument> sortDefinition, int skipNumber = 0, int takeNumber = 50, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { @@ -508,7 +563,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK .Sort(sortDefinition) .Skip(skipNumber) .Limit(takeNumber) - .ToListAsync(); + .ToListAsync(cancellationToken); } } } diff --git a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs index 3499a66..378e86e 100644 --- a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs +++ b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository.DataAccess.Read @@ -20,14 +21,19 @@ public partial class MongoDbReader /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> where TProjection : class { return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter) .Project(projection) - .FirstOrDefaultAsync(); + .FirstOrDefaultAsync(cancellationToken); } /// <summary> @@ -58,14 +64,19 @@ public virtual TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<F /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> where TProjection : class { return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter) .Project(projection) - .ToListAsync(); + .ToListAsync(cancellationToken); } /// <summary> diff --git a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs index c445c2f..98131fd 100644 --- a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs +++ b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs @@ -2,6 +2,7 @@ using MongoDbGenericRepository.Models; using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository @@ -18,7 +19,8 @@ public interface IBaseMongoRepository_Create<TKey> where TKey : IEquatable<TKey> /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="document">The document you want to add.</param> - Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument<TKey>; + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>; /// <summary> /// Adds a document to the collection. @@ -34,7 +36,8 @@ public interface IBaseMongoRepository_Create<TKey> where TKey : IEquatable<TKey> /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument<TKey>; + /// <param name="cancellationToken">An optional cancellation Token.</param> + Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>; /// <summary> /// Adds a list of documents to the collection. @@ -81,9 +84,10 @@ protected virtual MongoDbCreator MongoDbCreator /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="document">The document you want to add.</param> - public virtual async Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument<TKey> + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> { - await MongoDbCreator.AddOneAsync<TDocument, TKey>(document); + await MongoDbCreator.AddOneAsync<TDocument, TKey>(document, cancellationToken); } /// <summary> @@ -103,9 +107,10 @@ public virtual void AddOne<TDocument>(TDocument document) where TDocument : IDoc /// </summary> /// <typeparam name="TDocument">The type representing a Document.</typeparam> /// <param name="documents">The documents you want to add.</param> - public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument<TKey> + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> { - await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents); + await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents, cancellationToken); } /// <summary> diff --git a/MongoDbGenericRepository/Models/IndexCreationOptions.cs b/MongoDbGenericRepository/Models/IndexCreationOptions.cs index a117b2a..ad2d60c 100644 --- a/MongoDbGenericRepository/Models/IndexCreationOptions.cs +++ b/MongoDbGenericRepository/Models/IndexCreationOptions.cs @@ -52,10 +52,6 @@ public class IndexCreationOptions /// </summary> public string DefaultLanguage { get; set; } /// <summary> - /// Gets or sets the size of a geohash bucket. - /// </summary> - public double? BucketSize { get; set; } - /// <summary> /// Gets or sets the precision, in bits, used with geohash indexes. /// </summary> public int? Bits { get; set; } diff --git a/MongoDbGenericRepository/MongoDbGenericRepository.csproj b/MongoDbGenericRepository/MongoDbGenericRepository.csproj index f569520..c22899f 100644 --- a/MongoDbGenericRepository/MongoDbGenericRepository.csproj +++ b/MongoDbGenericRepository/MongoDbGenericRepository.csproj @@ -2,8 +2,9 @@ <PropertyGroup> <TargetFrameworks>net452;netstandard2.0;netstandard1.5;</TargetFrameworks> + <GenerateDocumentationFile>true</GenerateDocumentationFile> <PackageId>MongoDbGenericRepository</PackageId> - <PackageVersion>1.4.5</PackageVersion> + <PackageVersion>1.4.6</PackageVersion> <Authors>Alexandre Spieser</Authors> <PackageTitle>MongoDb Generic Repository</PackageTitle> <Description>A generic repository implementation using the MongoDB C# Sharp 2.0 driver.</Description> @@ -11,28 +12,20 @@ <PackageProjectUrl>http://www.opensource.org/licenses/mit-license.php</PackageProjectUrl> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageReleaseNotes>Release notes are at https://github.com/alexandre-spieser/mongodb-generic-repository/releases </PackageReleaseNotes> - <Copyright>Copyright 2020 (c) Alexandre Spieser. All rights reserved.</Copyright> + <Copyright>Copyright 2021 (c) Alexandre Spieser. All rights reserved.</Copyright> <PackageTags>MongoDb Repository Generic NoSql</PackageTags> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> - <Version>1.4.5</Version> + <Version>1.4.6</Version> <RepositoryUrl>https://github.com/alexandre-spieser/mongodb-generic-repository</RepositoryUrl> <RepositoryType>Git</RepositoryType> </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net45|AnyCPU'"> - <DocumentationFile>bin\Release\net45\MongoDbGenericRepository.xml</DocumentationFile> - </PropertyGroup> - - <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net452|AnyCPU'"> - <DocumentationFile></DocumentationFile> - </PropertyGroup> - - <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net452|AnyCPU'"> - <DocumentationFile>D:\development\mongodb-generic-repository\MongoDbGenericRepository\MongoDbGenericRepository.xml</DocumentationFile> - </PropertyGroup> + <PropertyGroup> + <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile> + </PropertyGroup> <ItemGroup> - <PackageReference Include="MongoDB.Driver" Version="2.9.3" /> + <PackageReference Include="MongoDB.Driver" Version="2.12.0" /> </ItemGroup> </Project> diff --git a/MongoDbGenericRepository/ReadOnlyMongoRepository.cs b/MongoDbGenericRepository/ReadOnlyMongoRepository.cs index e9ed276..9c9e33e 100644 --- a/MongoDbGenericRepository/ReadOnlyMongoRepository.cs +++ b/MongoDbGenericRepository/ReadOnlyMongoRepository.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; namespace MongoDbGenericRepository @@ -49,11 +50,12 @@ protected ReadOnlyMongoRepository(IMongoDatabase mongoDatabase) : base(mongoData /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="id">The Id of the document you want to get.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetByIdAsync<TDocument, TKey>(id, partitionKey); + return await MongoDbReader.GetByIdAsync<TDocument, TKey>(id, partitionKey, cancellationToken); } /// <summary> @@ -77,11 +79,12 @@ public virtual TDocument GetById<TDocument, TKey>(TKey id, string partitionKey = /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetOneAsync<TDocument, TKey>(filter, partitionKey); + return await MongoDbReader.GetOneAsync<TDocument, TKey>(filter, partitionKey, cancellationToken); } /// <summary> @@ -119,11 +122,12 @@ public virtual IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expr /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.AnyAsync<TDocument, TKey>(filter, partitionKey); + return await MongoDbReader.AnyAsync<TDocument, TKey>(filter, partitionKey, cancellationToken); } /// <summary> @@ -147,11 +151,12 @@ public virtual bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filte /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partition key.</param> - public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetAllAsync<TDocument, TKey>(filter, partitionKey); + return await MongoDbReader.GetAllAsync<TDocument, TKey>(filter, partitionKey, cancellationToken); } /// <summary> @@ -175,11 +180,12 @@ public virtual List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam> /// <param name="filter">A LINQ expression filter.</param> /// <param name="partitionKey">An optional partitionKey</param> - public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.CountAsync<TDocument, TKey>(filter, partitionKey); + return await MongoDbReader.CountAsync<TDocument, TKey>(filter, partitionKey, cancellationToken); } /// <summary> @@ -204,11 +210,15 @@ public virtual long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> fil /// <param name="filter">A LINQ expression filter.</param> /// <param name="maxValueSelector">A property selector to order by descending.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, object>> maxValueSelector, + string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetByMaxAsync<TDocument, TKey>(filter, maxValueSelector, partitionKey); + return await MongoDbReader.GetByMaxAsync<TDocument, TKey>(filter, maxValueSelector, partitionKey, cancellationToken); } /// <summary> @@ -232,13 +242,17 @@ public virtual TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bo /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="minValueSelector">A property selector to order by ascending.</param> + /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, object>> minValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetByMinAsync<TDocument, TKey>(filter, minValueSelector, partitionKey); + return await MongoDbReader.GetByMinAsync<TDocument, TKey>(filter, minValueSelector, partitionKey, cancellationToken); } /// <summary> @@ -247,7 +261,7 @@ public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<F /// <typeparam name="TDocument">The document type.</typeparam> /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="minValueSelector">A property selector to order by ascending.</param> + /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null) where TDocument : IDocument<TKey> @@ -263,13 +277,18 @@ public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bo /// <typeparam name="TKey">The type of the primary key.</typeparam> /// <typeparam name="TValue">The type of the value used to order the query.</typeparam> /// <param name="filter">A LINQ expression filter.</param> - /// <param name="maxValueSelector">A property selector to select the max value.</param> + /// <param name="maxValueSelector">A property selector for the maximum value you are looking for.</param> /// <param name="partitionKey">An optional partitionKey.</param> - public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TValue>> maxValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetMaxValueAsync<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey); + return await MongoDbReader.GetMaxValueAsync<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey, cancellationToken); } /// <summary> @@ -297,11 +316,16 @@ public virtual TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocu /// <param name="filter">A LINQ expression filter.</param> /// <param name="minValueSelector">A property selector to order by ascending.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TValue>> minValueSelector, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.GetMinValueAsync<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey); + return await MongoDbReader.GetMinValueAsync<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey, cancellationToken); } /// <summary> @@ -332,13 +356,15 @@ public virtual TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocu /// <param name="filter">A LINQ expression filter.</param> /// <param name="selector">The field you want to sum.</param> /// <param name="partitionKey">The partition key of your document, if any.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, int>> selector, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { - return await MongoDbReader.SumByAsync<TDocument, TKey>(filter, selector, partitionKey); + return await MongoDbReader.SumByAsync<TDocument, TKey>(filter, selector, partitionKey, cancellationToken); } /// <summary> @@ -405,12 +431,17 @@ public virtual decimal SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>> /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> where TProjection : class { - return await MongoDbReader.ProjectOneAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey); + return await MongoDbReader.ProjectOneAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey, cancellationToken); } /// <summary> @@ -439,12 +470,16 @@ public virtual TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<F /// <param name="filter">A LINQ expression filter.</param> /// <param name="projection">The projection expression.</param> /// <param name="partitionKey">An optional partition key.</param> - public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null) + /// <param name="cancellationToken">An optional cancellation Token.</param> + public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>( + Expression<Func<TDocument, bool>> filter, + Expression<Func<TDocument, TProjection>> projection, + string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> where TProjection : class { - return await MongoDbReader.ProjectManyAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey); + return await MongoDbReader.ProjectManyAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey, cancellationToken); } /// <summary> @@ -562,12 +597,14 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param> /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param> /// <param name="partitionKey">An optional partition key.</param> + /// <param name="cancellationToken">An optional cancellation Token.</param> public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>( Expression<Func<TDocument, bool>> filter, SortDefinition<TDocument> sortDefinition, int skipNumber = 0, int takeNumber = 50, - string partitionKey = null) + string partitionKey = null, + CancellationToken cancellationToken = default) where TDocument : IDocument<TKey> where TKey : IEquatable<TKey> { @@ -576,7 +613,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK .Sort(sortDefinition) .Skip(skipNumber) .Limit(takeNumber) - .ToListAsync(); + .ToListAsync(cancellationToken); } #endregion Pagination