ShadowSql之表达式树

ShadowSql的主要思想通过表和字段的影子来拼写sql

.net中的表达式树是作为模型类和查询逻辑的影子,非常契合ShadowSql

拿表达式树来拼写sql就和EF类似

一、nuget包

nuget安装ShadowSql.Expressions

引用命名空间: ShadowSql.Expressions

二、简单用法

  1. 表达式查询

1.1 按常量查询

复制代码
var query = new TableSqlQuery<User>("Users")
.Where(u => u.Name == "张三");
// SELECT * FROM [Users] WHERE [Name]='张三'

1.2 按参数查询

复制代码
var query = new TableSqlQuery<User>()
.Where<UserParameter>((u, p) => u.Age > p.Age2);
// SELECT * FROM [User] WHERE [Age]>@Age2
  1. 表达式排序

2.1 对单个字段排序

复制代码
var cursor = new Table("Users")
.Take<User>(10)
.Asc(u => u.Id);
// SELECT TOP 10 * FROM [Users] ORDER BY [Id]

2.2 对多个字段排序

复制代码
var cursor = new Table("Users")
.Take<User>(10)
.Desc(u => new { u.Age, u.Id });
// SELECT TOP 10 * FROM [Users] ORDER BY [Age] DESC,[Id] DESC
  1. 联表查询

3.1 主外键联表

复制代码
var query = new Table("Users")
    .SqlJoin<User, UserRole>(new Table("UserRoles"))
    .On(u => u.Id, r => r.UserId);
// SELECT * FROM [Users] AS t1 INNER JOIN [UserRoles] AS t2 ON t1.[Id]=t2.[UserId]

3.2 逻辑表达式联表

复制代码
var query = new Table("Users")
    .SqlJoin<User, UserRole>(new Table("UserRoles"))
    .On((u, r) => u.Id == r.UserId);
// SELECT * FROM [Users] AS t1 INNER JOIN [UserRoles] AS t2 ON t1.[Id]=t2.[UserId]
  1. 插入

4.1 插入常量值

复制代码
var insert = new Table("Users")
.ToInsert(() => new User { Name = "张三", Age = 18 });
// INSERT INTO [Users]([Name],[Age])VALUES('张三',18)

4.2 插入参数

复制代码
var insert = new Table("Users")
    .ToInsert<UserParameter, User>(p => new User { Name = p.Name2, Age = p.Age2 });
// INSERT INTO [Users]([Name],[Age])VALUES(@Name2,@Age2)
  1. 表达式删除
复制代码
var delete = new TableSqlQuery<Student>("Students")
    .Where(s => s.Score < 60)
    .ToDelete();
// DELETE FROM [Students] WHERE [Score]<60
  1. 表达式更新

6.1 常量更新

复制代码
var update = new Table("Users")
    .ToUpdate<User>(u => u.Id == 1)
    .Set(u => new User { Age = 18 });
// UPDATE [Users] SET [Age]=18 WHERE [Id]=1

6.2 参数化更新

复制代码
var user = new User { Id =1, Age = 18 };
var update = EmptyTable.Use("Users")
    .ToUpdate<User>(u => u.Id == user.Id)
    .Set(u => new User { Age = user.Age });
// UPDATE [Users] SET [Age]=@Age WHERE [Id]=@Id

6.3 原值叠加更新

复制代码
var update = new Table("Students")
    .ToUpdate<Student>(u => u.Score < 60 && u.Score > 55)
    .Set(u => new Student { Score = u.Score + 5 });
// UPDATE [Students] SET [Score]=([Score]+5) WHERE [Score]<60 AND [Score]>55

7、表达式获取数据

7.1 直接获取全表

复制代码
var select = new Table("Users")
    .ToSelect<User>()
    .Select(u => new { u.Id, u.Name });
// SELECT [Id],[Name] FROM [Users]

7.3 从表达式获取

复制代码
var select = new Table("Users")
    .ToSelect<User>(u => u.Status)
    .Select(u => u.Id);
// SELECT [Id] FROM [Users] WHERE [Status]=1

7.3 从表查询获取

复制代码
var select = new Table("Users")
    .ToSqlQuery<User>()
    .Where(u => u.Status)
    .ToSelect()
    .Select(u => new { u.Id, u.Name });
// SELECT [Id],[Name] FROM [Users] WHERE [Status]=1

7.4 分页获取

复制代码
var select = new Table("Users")
    .ToSqlQuery<User>()
    .Where(u => u.Status)
    .Take(10, 20)
    .Desc(u => u.Id)
    .ToSelect();
// SELECT * FROM [Users] WHERE [Status]=1 ORDER BY [Id] OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY

欢迎大家尝试,有什么问题给我留言,我会尽力满足大家的需求

源码托管地址: https://github.com/donetsoftwork/Shadow,也欢迎大家直接查看源码。

文档地址: https://donetsoftwork.github.io/Shadow/expression/index.html

如果大家喜欢请动动您发财的小手手帮忙点一下Star。

相关推荐
写了20年代码的老程序员20 小时前
写了 20 年 Java,我受够了 MyBatis 的 4 个瞬间
mybatis·orm
rising start7 天前
InsightEdu - 轻量智能学习平台
javascript·axios·css3·html5·fastapi·orm·dify
码农刚子9 天前
.NET 8 Web开发入门(四):注入燃料——Entity Framework Core 与 Code First 实战
数据库·orm·sql server
CSharp精选营9 天前
.NET 8 Web开发入门(四):注入燃料——Entity Framework Core 与 Code First 实战
orm·sql server·数据库迁移·ef core·entity framework core·crud操作·code first
阿kun要赚马内11 天前
后端数据操作组合:Pydantic与ORM
后端·python·orm·sqlalchemy
jump_jump13 天前
Drizzle 凭什么贴着 Go 跑——从设计哲学到热路径源码
数据库·性能优化·orm
L-影15 天前
常见的 ORM 工具
开发语言·数据库·fastapi·orm
李温候15 天前
互联网大厂Java求职者面试全攻略
java·数据库·面试·orm·构建工具·web框架·互联网大厂
L-影15 天前
fastapi中的ORM
数据库·fastapi·orm
在屏幕前出油1 个月前
08. ORM——快速开始
数据库·后端·python·sql·pycharm·orm