using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Dpz.Core.Entity.Base;
using MongoDB.Driver;
namespace Dpz.Core.MongodbAccess;
public interface IRepository
{
IMongoDatabase Database { get; }
}
public interface IRepository<T> : IRepository
where T : IBaseEntity
{
/// <summary>
/// 获取 该实体Mongodb的集合
/// </summary>
IMongoCollection<T> Collection { get; }
/// <summary>
/// Queryable
/// </summary>
IQueryable<T> MongodbQueryable { get; }
/// <summary>
/// 查询数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
/// <summary>
/// 数据查询
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
IFindFluent<T, T> SearchFor(FilterDefinition<T> filter);
/// <summary>
///
/// </summary>
/// <param name="filter"></param>
/// <param name="options"></param>
/// <returns></returns>
IFindFluent<T, T> SearchFor(FilterDefinition<T> filter, FindOptions options);
/// <summary>
/// 异步 数据查询
/// </summary>
/// <param name="filter"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
IAsyncEnumerable<T> SearchForAsync(
FilterDefinition<T> filter,
CancellationToken cancellationToken = default
);
/// <summary>
/// 异步 数据查询
/// </summary>
/// <param name="filter"></param>
/// <param name="options"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
IAsyncEnumerable<T> SearchForAsync(
FilterDefinition<T> filter,
FindOptions<T> options,
CancellationToken cancellationToken = default
);
#region 异步方法
/// <summary>
/// (异步)根据 Id 获取单条记录,不存在将会返回null
/// </summary>
/// <param name="id"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<T?> FindAsync(object id, CancellationToken cancellationToken = default);
/// <summary>
/// 插入数据
/// </summary>
/// <param name="entity"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task InsertAsync(T entity, CancellationToken cancellationToken = default);
/// <summary>
/// 插入数据
/// </summary>
/// <param name="source"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task InsertAsync(IReadOnlyCollection<T> source, CancellationToken cancellationToken = default);
/// <summary>
/// 删除数据
/// </summary>
/// <param name="filter"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(
Expression<Func<T, bool>> filter,
CancellationToken cancellationToken = default
);
/// <summary>
/// 删除数据
/// </summary>
/// <param name="filter"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(
FilterDefinition<T> filter,
CancellationToken cancellationToken = default
);
/// <summary>
/// 根据ID删除
/// </summary>
/// <param name="id"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(object id, CancellationToken cancellationToken = default);
/// <summary>
/// 根据查询条件更新数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="update"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<UpdateResult> UpdateAsync(
Expression<Func<T, bool>> predicate,
UpdateDefinition<T> update,
CancellationToken cancellationToken = default
);
/// <summary>
/// 根据实体修改数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <param name="cancellationToken"></param>
/// <exception cref="ArgumentException">If the entity no exists property 'id',then will throw exception.</exception>
Task<ReplaceOneResult> UpdateAsync(T entity, CancellationToken cancellationToken = default);
/// <summary>
/// 批量修改实体
/// </summary>
/// <param name="entities"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<BulkWriteResult<T>> UpdateAsync(
IEnumerable<T> entities,
CancellationToken cancellationToken = default
);
#endregion
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个基于MongoDB的仓储模式(Repository Pattern)接口定义代码,用于封装MongoDB数据访问操作。让我详细解释一下:
接口结构
1. IRepository 基础接口
public interface IRepository
{
IMongoDatabase Database { get; }
}
- 这是一个基础接口,提供对MongoDB数据库实例的访问
- 所有仓储都需要实现这个接口
2. IRepository<T> 泛型接口
这是主要的仓储接口,继承自基础接口,其中 T 必须实现 IBaseEntity 接口。
主要功能分类
数据访问属性
Collection:获取MongoDB中对应实体的集合MongodbQueryable:提供LINQ查询能力
查询方法
提供了多种查询方式:
- 基于表达式的查询:
SearchFor(Expression<Func<T, bool>> predicate) - 基于过滤器的查询:
SearchFor(FilterDefinition<T> filter) - 异步查询:
SearchForAsync方法,返回IAsyncEnumerable<T>
异步CRUD操作
查询(Read)
FindAsync(object id):根据ID查找单条记录
创建(Create)
InsertAsync(T entity):插入单条记录InsertAsync(IReadOnlyCollection<T> source):批量插入
删除(Delete)
DeleteAsync(Expression<Func<T, bool>> filter):基于表达式删除DeleteAsync(FilterDefinition<T> filter):基于过滤器删除DeleteAsync(object id):根据ID删除
更新(Update)
UpdateAsync(Expression<Func<T, bool>> predicate, UpdateDefinition<T> update):条件更新UpdateAsync(T entity):实体更新UpdateAsync(IEnumerable<T> entities):批量更新
设计特点
- 异步优先:所有数据操作都是异步的,支持
CancellationToken - 类型安全:使用泛型约束确保实体类型正确
- 灵活查询:支持LINQ表达式和MongoDB原生过滤器
- 批量操作:支持批量插入和更新
- 返回类型丰富:不同操作返回相应的MongoDB结果类型(如
DeleteResult、UpdateResult等)
这个接口设计遵循了仓储模式的最佳实践,为MongoDB数据访问提供了统一、类型安全且功能完整的抽象层。
AI 正在分析代码…
评论加载中...