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

2. 表达式排序
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

3. 联表查询
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]

4. 插入
4.1 插入常量值

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

4.2 插入参数

var insert = EmptyTable.Use("Users")
.ToInsert<UserParameter, User>(p => new User { Name = p.Name2, Age = p.Age2 });
// INSERT INTO [Users]([Name],[Age])VALUES(@Name2,@Age2)

5. 表达式删除

var delete = new TableSqlQuery<Student>("Students")
.Where(s => s.Score < 60)
.ToDelete();
// DELETE FROM [Students] WHERE [Score]<60

6. 表达式更新
6.1 常量更新

var update = EmptyTable.Use("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 = EmptyTable.Use("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 = _db.From("Users")
.ToSelect<User>()
.Select(u => new { u.Id, u.Name });
// SELECT [Id],[Name] FROM [Users]

7.3 从表达式获取

var select = _db.From("Users")
.ToSelect<User>(u => u.Status)
.Select(u => u.Id);
// SELECT [Id] FROM [Users] WHERE [Status]=1

7.3 从表查询获取

var select = _db.From("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 = _db.From("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。

ShadowSql之表达式树的更多相关文章

  1. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  2. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  3. 轻量级表达式树解析框架Faller

    有话说 之前我写了3篇关于表达式树解析的文章 干货!表达式树解析"框架"(1) 干货!表达式树解析"框架"(2) 干货!表达式树解析"框架" ...

  4. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  5. LinqToDB 源码分析——处理表达式树

    处理表达式树可以说是所有要实现Linq To SQL的重点,同时他也是难点.笔者看完作者在LinqToDB框架里面对于这一部分的设计之后,心里有一点不知所然.由于很多代码没有文字注解.所以笔者只能接合 ...

  6. LinqToDB 源码分析——生成表达式树

    当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...

  7. 干货!表达式树解析"框架"(1)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...

  8. 干货!表达式树解析"框架"(2)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 为了过个好年,我还是赶快把这篇完成了吧 声明 本文内容需要有一定 ...

  9. 干货!表达式树解析"框架"(3)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 这应该是年前最后一篇了,接下来的时间就要陪陪老婆孩子了 关于表达 ...

  10. Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

    回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...

随机推荐

  1. 面试题64. 求1+2+…+n

    地址:https://leetcode-cn.com/problems/qiu-12n-lcof/ <?php /** 求 1+2+...+n ,要求不能使用乘除法.for.while.if.e ...

  2. C#/.NET/.NET Core技术前沿周刊 | 第 28 期(2025年2.24-2.28)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  3. STM32实战——ESP8266 WIFI模块

    ESP8266 硬件介绍 ESP8266系列模组有哪些: 在本实验中,ESP8266与ESP-01不做区分. ESP-01引脚介绍: 引脚 功能 3.3 3.3V供电,避免使用5V供电 RX UART ...

  4. 题解:CF2077B Finding OR Sum

    本文发布于博客园和洛谷,若您在其他平台阅读到此文,请前往博客园获得更好的阅读体验. 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18771334 ...

  5. postman发送数组

    postman发送数组 第一种 第二种

  6. jquery submit 解决多次提交

    jquery submit 解决多次提交 web应用中常见的问题就是多次提交,由于表单提交的延迟,有时几秒或者更长,让用户有机会多次点击提交按钮,从而导致服务器端代码的种种麻烦. 为了解决这个问题,我 ...

  7. 算法分析-回溯算法-求解N皇后问题

    一.题目需求 n皇后问题是一道比较经典的算法题.它研究的是将n个皇后放置在一个n×n的棋盘上,使皇后彼此之间不相互攻击. 即任意两个皇后都不能处于同一行.同一列或同一斜线上. 二.算法思想 1.构建棋 ...

  8. 懂了 OpenLDAP

    轻型目录访问协议(英文: LightweightDirectoryAccessProtocol,缩写: LDAP)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目 ...

  9. CoreOS 手动更新

    以阿里云 ECS 安装的 CoreOS 为例,你家装的 CoreOS 基本也一样啦. 查看和修改更新组 第一个问题:"什么是更新组?",请先看CoreOS 发行版本介绍 # 查看更 ...

  10. Go 调用系统默认浏览器打开链接

    Go Package 相关包 os/exec 实例 调用Windows系统默认浏览器打开链接 package main import ( "fmt" "os/exec&q ...