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. Redis集群(cluster模式)搭建(三主三从)

    上一篇搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用.仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理 ...

  2. 【数学公式】mathtype和word2016集成

    mathtype 安装好了以后,word 没有相应的选项卡怎么办? 问题 解决办法 找到word的启动路径 2. 找到mathtype 安装好后的mathpage文件夹 进入文件夹,找到MathPag ...

  3. git push解决 error src refspec master does not match anyerror

    前言 git push origin master git push 时报错: error: src refspec master does not match anyerror: failed to ...

  4. linux ubuntu mysql 默认密码

    前言 linux ubuntu安装mysql Ubuntu 安装 MySQL 后,在 /etc/mysql 目录下有个 debian.cnf,这里存储着默认的密码. [client] host = l ...

  5. go 整分钟开始执行程序

    前言 有时候我们的程序要求整分钟开始运行,这时候就需要对当前时间进行判断 package main import ( "fmt" "time" ) func m ...

  6. linux 源码安装完php后在目录下找不到php.ini的问题

    首先,我们需要确定php版本的php.ini文件需要放在个目录下 我们先执行以下命令查看php的php.ini目录应该放在那个地方 php -i |grep php.ini 效果如下,现在我们确定好了 ...

  7. Django实战项目-学习任务系统-配置定时调度任务

    接着上期代码内容,继续完善优化系统功能. 本次增加配置定时调度任务功能,学习任务系统定时任务管理添加的定时学习任务,需要通过配置调度任务,定时发布周期性的学习任务. 以及每天定时发送学生用户属性值,积 ...

  8. SpringBoot原理分析-1

    SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧.熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了.我们来看 ...

  9. Netty源码—2.Reactor线程模型一

    大纲 1.关于NioEventLoop的问题整理 2.理解Reactor线程模型主要分三部分 3.NioEventLoop的创建 4.NioEventLoop的启动 1.关于NioEventLoop的 ...

  10. Delphi 使用API函数AnimateWindow实现窗体特效功能

    API函数 AnimateWindow 使用: 函数功能:窗体显示和隐藏时产生特殊的动画效果:可以产生两种类型的动画效果: 滚动动画 和 滑动动画 函数原型:BOOL AnimateWindow(HW ...