BaseQuery今生
上篇我介绍了,BaseQuery的前世.这里我介绍以下BaseQuery的今生.
1|0轮子造好怎么用?
1|11.添加包源地址
https://www.myget.org/F/basequery/api/v3/index.json
1|22.新建一个.Net6 WebAPI项目
1|33.引用Nuget
dotnet add package BaseQuery
1|44.具体使用
/// <summary>
/// 仓储接口 /// </summary> /// <typeparam name="T">实体</typeparam> /// <typeparam name="C">新增参数</typeparam> /// <typeparam name="U">修改参数</typeparam> /// <typeparam name="R">查询参数</typeparam> public interface IRepository<T, C, U, R> where T : BaseEntity, new() where R : class, new() { /// <summary> /// 新增 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> InsertAsync(C data); /// <summary> /// 新增 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> InsertAsync(IEnumerable<C> data); /// <summary> /// 修改 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> UpdateAsync(U data); /// <summary> /// 修改 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> UpdateAsync(IEnumerable<U> data); /// <summary> /// 删除 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> DeleteAsync(T data); /// <summary> /// 删除 /// </summary> /// <param name="data"></param> /// <returns></returns> Task<int> DeleteAsync(IEnumerable<T> data); /// <summary> /// [单表]获取实体 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<T> GetEntityAsync(R input); /// <summary> /// [单表]获取实体集合 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<IEnumerable<T>> GetEntityListAsync(R input); /// <summary> /// [单表]获取分页实体集合 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<IEnumerable<T>> GetPageEntityListAsync(PageEntity<R> input); }
只需要封装一个仓储.基础的查询就不用写了
/// <summary>
/// 基础仓储 /// </summary> /// <typeparam name="T">实体参数</typeparam> /// <typeparam name="C">新增参数</typeparam> /// <typeparam name="U">修改参数</typeparam> /// <typeparam name="R">读取参数</typeparam> public class BaseRepository<T, C, U, R> : BaseDynamicExpression<T, R>, IRepository<T, C, U, R> where T : BaseEntity, new() where R : class, new() { protected readonly ISqlSugarClient _db; public BaseRepository(ISqlSugarClient db) { _db = db; } /// <summary> /// 新增 /// </summary> /// <returns></returns> public async Task<int> InsertAsync(C input) { return await _db.Insertable<T>(input.MapTo<C, T>()).ExecuteCommandAsync(); } /// <summary> /// 新增 /// </summary> /// <returns></returns> public async Task<int> InsertAsync(IEnumerable<C> input) { return await _db.Insertable<T>(input.MapTo<C, T>()).ExecuteCommandAsync(); } /// <summary> /// 修改 /// </summary> /// <returns></returns> public async Task<int> UpdateAsync(U input) { return await _db.Updateable<T>(input.MapTo<U, T>()).ExecuteCommandAsync(); } /// <summary> /// 修改 /// </summary> /// <returns></returns> public async Task<int> UpdateAsync(IEnumerable<U> input) { return await _db.Updateable<T>(input.MapTo<U, T>()).ExecuteCommandAsync(); } /// <summary> /// 修改 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<int> UpdateAsync(Expression<Func<T, bool>> input) { return await _db.Updateable<T>(input).ExecuteCommandAsync(); } /// <summary> /// 删除 /// </summary> /// <returns></returns> public async Task<int> DeleteAsync(IEnumerable<T> data) { return await _db.Deleteable<T>(data).ExecuteCommandAsync(); } /// <summary> /// 删除 /// </summary> /// <returns></returns> public async Task<int> DeleteAsync(T data) { return await _db.Deleteable<T>(data).ExecuteCommandAsync(); } /// <summary> /// 删除 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<int> DeleteAsync(Expression<Func<T, bool>> input) { return await _db.Deleteable<T>(input).ExecuteCommandAsync(); } /// <summary> /// [单表]获取集合 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<IEnumerable<T>> GetEntityListAsync(R input) { return await this.GetSqlSugarExpression(input).ToListAsync(); } /// <summary> /// [单表]获取单个 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<T> GetEntityAsync(R input) { return await this.GetSqlSugarExpression(input).FirstAsync(); } /// <summary> /// [单表]获取分页 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<IEnumerable<T>> GetPageEntityListAsync(PageEntity<R> input) { var res = this.GetSqlSugarExpression(input.Data); if (!string.IsNullOrEmpty(input.OrderField)) res.OrderBy(input.OrderField); return await res.ToPageListAsync(input.PageIndex, input.PageSize, input.Total); } /// <summary> /// 获取SqlSugar的表达式目录树 /// </summary> /// <param name="input"></param> /// <returns></returns> private ISugarQueryable<T> GetSqlSugarExpression(R input) { var res = GetExpression(input); return _db.Queryable<T>().WhereIF(res.Condition, res.Expression); } }
重点在这里
/// <summary>
/// [单表]获取集合 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<IEnumerable<T>> GetEntityListAsync(R input) { return await this.GetSqlSugarExpression(input).ToListAsync(); } /// <summary> /// [单表]获取单个 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<T> GetEntityAsync(R input) { return await this.GetSqlSugarExpression(input).FirstAsync(); } /// <summary> /// [单表]获取分页 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<IEnumerable<T>> GetPageEntityListAsync(PageEntity<R> input) { var res = this.GetSqlSugarExpression(input.Data); if (!string.IsNullOrEmpty(input.OrderField)) res.OrderBy(input.OrderField); return await res.ToPageListAsync(input.PageIndex, input.PageSize, input.Total); } /// <summary> /// 获取SqlSugar的表达式目录树 /// </summary> /// <param name="input"></param> /// <returns></returns> private ISugarQueryable<T> GetSqlSugarExpression(R input) { var res = GetExpression(input); return _db.Queryable<T>().WhereIF(res.Condition, res.Expression); }
1|5举例实现
只需要这样简单的继承一下.基础的增删改查就不用重复的写了.
/// <summary>
/// 学校仓储 /// </summary> public interface ISchoolRepository : IRepository<SchoolEntity, SchoolAddInput, SchoolModifyInput, SchoolQueryInput> { }
/// <summary>
/// 学校仓储 /// </summary> public class SchoolRepository : BaseRepository<SchoolEntity, SchoolAddInput, SchoolModifyInput, SchoolQueryInput>, ISchoolRepository { public SchoolRepository(ISqlSugarClient db) : base(db) { } }
2|0规范
以Name为例
public string Name { get; set; }
- 相等(=):查询实体的字段名称和类型必须和对应实体属性一致
查询实体属性: public string Name
- 小于(<):查询实体的字段后缀要加上
LessThan
查询实体属性: public int IdLessThan
- 小于等于(<=):查询实体的字段后缀要加上
LessThanOrEqual
查询实体属性: public int IdLessThanOrEqual
- 大于(>):查询实体的字段后缀要加上
GreaterThan
查询实体属性: public int IdGreaterThan
- 大于等于(>=):查询实体的字段后缀要加上
GreaterThanOrEqual
查询实体属性: public int IdGreaterThanOrEqual
- 不等于(<>/!=):查询实体的字段后缀要加上
NotEqual
查询实体属性: public int IdNotEqual { get; set; }
public string NameNotEqual
- 模糊(Contains):类型相同,并且在名称相同的基础上,查询实体的字段后缀要加上
Contains
查询实体属性: public string NameContains
- StartsWith
public string NameStartsWith
- EndsWith
public string NameEndsWith
- 集合(IN): 以下三选一
public List
Name_Contains { get; set; }
public string[] Name_Contains { get; set; }
public IEnumerableName_Contains
2|1思想:
- 约定大约配置
定义:系统,类库,框架假定其合理的默认值,而非要求提供不必要的配置。 在大部分情况下,使用框架提供的默认值会让项目运行的更快。
这里我理解的只有两个字-那就是规范
.大家都去遵守某种规范,那么这种规范也就成了默认值,减少了很多成本.;体现在字段的命名上面.减少配置.用通俗易懂的规范.
- 封装
所谓的封装,无非就是减少变化,把不变的部分合理的封装成公用的,把变化转移到上层.使下层更加稳定.这里我有一些感慨,程序稳定性和逻辑的复杂度以及工作量的大小 大多数情况下和封装有紧密的联系.
不要写重复的代码
.只要是看到大量重复
类似
的代码.那这个就是代码坏掉的味道
那就要想办法去适当的改造. 不要让代码成为垃圾堆,你去堆一下 我去堆一下的.这样下去终有一天会让你加班到崩溃.垃圾
要进行垃圾
分类.同样代码也需要分类
.
__EOF__

本文链接:https://www.cnblogs.com/vsnb/p/16069606.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)