ShadowSql之.net sql拼写神器

打印 上一主题 下一主题

主题 1786|帖子 1786|积分 5358

我正在开发的一个.net sql拼写工具(SqlBuilder),也可以算是ORM,命名为ShadowSql
本工具的作用就是帮码农拼写sql,对标开源项目SqlKata。
在项目里面直接拼写sql很容易堕落,是件很Low的事情,以是我们需要ORM工具。
但是有些ORM很重,很担心造成性能问题,这就是开发本工具的出发点.
本工具很小、不依靠第三方包,不使用反射,应该支持AOT原生编译,不过我还没测试。
本工具最大的特点就是性能好,省内存,拼接sql从头至尾只使用一个StringBuilder。
跨平台、可扩展、支持多种数据库,可以自定义数据库方言,支持net7.0;net8.0;net9.0;netstandard2.0;netstandard2.1。
本工具最得当搭配Dapper使用,以是附带了一个Dapper扩展。当然直接搭配ado.net也是可以的。
sql操纵用的最多也是最复杂的就是查询,本工具包罗两套查询模式:sql模式和逻辑模式。
一、先介绍sql查询模式
1、支持按原生sql举行查询,示例如下:
  1.         var query = db.From("Users")
  2.             .ToSqlQuery()
  3.             .Where("Id=@Id", "Status=@Status");
复制代码
sql: SELECT * FROM [Users] WHERE Id=@Id AND Status=@Status
2、支持按逻辑查询
  1.         var query = new UserTable()
  2.             .ToSqlQuery()
  3.             .Where(Id.EqualValue(100));
复制代码
sql: SELECT * FROM [Users] WHERE [Id]=100
3、支持GroupBy
  1.         var table = db.From("Users");
  2.         var groupBy = table.ToSqlQuery()
  3.             .ColumnEqualValue("Age", 20)
  4.             .GroupBy("CityId")
  5.             .Having(g => g.Aggregate("MAX", "Level").GreaterValue(9));
复制代码
sql: SELECT * FROM [Users] WHERE [Age]=20 GROUP BY [CityId] HAVING MAX([Level])>9
4、支持联表
  1.         var employees = db.From("Employees");
  2.         var departments = db.From("Departments");
  3.         var joinOn = employees.SqlJoin(departments)
  4.             .On(static (t1, t2) => t1.Field("DepartmentId").Equal(t2.Field("Id")));
  5.         var joinTable = joinOn.Root
  6.             .Where(join => join.From("t2").Field("Manager").EqualValue("CEO"));
复制代码
sql: SELECT * FROM [Employees] AS t1 INNER JOIN [Departments] AS t2 ON t1.[DepartmentId]=t2.[Id] WHERE t2.[Manager]='CEO'
二、逻辑模式
以上功能逻辑模式大多都支持,逻辑模式是按And、Or来查询的。没有where、having、on等关键字
逻辑模式不支持按原生sql查询,当然封装为逻辑对象就可以了,但不推荐这么做。
所谓逻辑就是与、或、非运算。
Sql模式也支持逻辑对象,从这个层面上说sql模式功能更全,sql模式查询对象就是包罗一个复合逻辑对象+Sql查询对象。
逻辑模式一样平常执行速度更快、内存斲丧更少。
1、单表查询
  1.         var query = db.From("Users")
  2.             .ToQuery()
  3.             .And(_id.Equal())
  4.             .And(_status.Equal("Status"));
复制代码
  1.         var query = db.From("Users")
  2.             .ToOrQuery()
  3.             .Or(_id.Equal())
  4.             .Or(_status.Equal("Status"));
复制代码
SELECT * FROM [Users] WHERE [Id]=@Id AND [Status]=@Status
SELECT * FROM [Users] WHERE [Id]=@Id OR [Status]=@Status
2、GroupBy
  1.         var groupBy = table.ToQuery()
  2.             .And(Age.EqualValue(20))
  3.             .GroupBy("CityId")
  4.             .And(Level.Max().GreaterValue(9));
复制代码
sql: SELECT * FROM [Users] WHERE [Age]=20 GROUP BY [CityId] HAVING MAX([Level])>9
3、联表
  1.         CommentTable c = new("c");
  2.         PostTable p = new("p");
  3.         var joinOn = c.Join(p)
  4.             .And(c.PostId.Equal(p.Id));
  5.         var query = joinOn.Root
  6.             .And(c.Pick.Equal())
  7.             .And(p.Author.Equal())
复制代码
sql: SELECT * FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id] where c.[Pick]=@Pick AND p.[Author]=@Author
篇幅有限,另有很多功能没法在这里逐一列举,接待大家去探索,抽出时间我也会再发新文章来做更详细的介绍。
三、两种模式与SqlKata对比速度都更快,斲丧内存也更少

 更多信息可以到github上查询,或下载代码自己测试一下
四、源码托管在github上
仓库地址: https://github.com/donetsoftwork/Shadow
如果大家喜好请动动您发财的小手手帮助点一下Star。
有什么发起也可以反馈给我,该项目还在开发中,还大概会增长更多有趣的功能。
而且我还计划为这个工具再开发一个精简版本,以求更好的性能。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表