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。

相关推荐
掉头发的王富贵2 天前
【JOOQ】同事凭什么说它是世界上最好用的ORM框架
后端·mybatis·orm
o0向阳而生0o7 天前
68、.NET Entity Framework(EF)
.net·orm·ef
xiangji10 天前
.net 实现 CQRS 的的一个设想
orm·sqlbuilder
却尘13 天前
当全世界都在用 Rust 重写一切时,Prisma 却选择了反方向
前端·数据库·orm
喵个咪15 天前
开箱即用的GO后台管理系统 Kratos Admin - 代码生成工具集
微服务·orm·protobuf
xiangji17 天前
ShadowSql.net之正确使用方式
orm·dapper·可扩展·sqlbuilder·面向接口
MyikJ19 天前
Java求职面试:从Spring到微服务的技术挑战
java·数据库·spring boot·spring cloud·微服务·orm·面试技巧
Jaising66621 天前
Mybatis Plus 多租户实现思路分析
spring boot·mybatis·orm
Python智慧行囊24 天前
Django 中的 ORM 基础语法
数据库·oracle·sqlite·orm