using MongoDB.Driver;
using MongoDbGenericRepository.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace MongoDbGenericRepository
{
public interface IBaseReadOnlyRepository
{
///
/// The connection string.
///
string ConnectionString { get; }
///
/// The database name.
///
string DatabaseName { get; }
#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 Min / Max
///
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by descending.
/// An optional partitionKey.
Task GetByMaxAsync(Expression> filter, Expression> orderByDescending, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by descending.
/// An optional partitionKey.
TDocument GetByMax(Expression> filter, Expression> orderByDescending, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
Task GetByMinAsync(Expression> filter, Expression> orderByAscending, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
TDocument GetByMin(Expression> filter, Expression> orderByAscending, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
Task GetMaxValueAsync(Expression> filter, Expression> maxValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
TValue GetMaxValue(Expression> filter, Expression> orderByDescending, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// The type of the value used to order the query.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partition key.
Task GetMinValueAsync(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// The type of the value used to order the query.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partition key.
TValue GetMinValue(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
#endregion
#region Sum
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
Task SumByAsync(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
int SumBy(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
Task SumByAsync(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
decimal SumBy(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
#endregion Sum
#region Project TKey
///
/// 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 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 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 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
#region Group By
///
/// 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.
///
/// The type representing a Document.
/// The type of the grouping criteria.
/// The type of the projected group.
/// A LINQ expression filter.
/// The grouping criteria.
/// The projected group result.
/// The partition key of your document, if any.
List GroupBy(
Expression> groupingCriteria,
Expression, TProjection>> groupProjection,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class, new();
///
/// 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.
///
/// The type representing a Document.
/// The type of the grouping criteria.
/// The type of the projected group.
/// A LINQ expression filter.
/// The grouping criteria.
/// The projected group result.
/// The partition key of your document, if any.
List GroupBy(
Expression> filter,
Expression> groupingCriteria,
Expression, TProjection>> groupProjection,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class, new();
#endregion Group By
#region Pagination
///
/// 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.
/// A LINQ expression filter.
/// The property selector.
/// Order of the sorting.
/// 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> GetSortedPaginatedAsync(
Expression> filter,
Expression> sortSelector,
bool ascending = true,
int skipNumber = 0,
int takeNumber = 50,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
///
/// 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.
/// A LINQ expression filter.
/// The sort definition.
/// 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> GetSortedPaginatedAsync(
Expression> filter,
SortDefinition sortDefinition,
int skipNumber = 0,
int takeNumber = 50,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable;
#endregion Pagination
}
}