Reface.NPI 方法名称解析规则详解
在上次的文章中简单介绍了 Reface.NPI 中的功能。
本期,将对这方法名称解析规则进行详细的解释和说明,
以便开发者可以完整的使用 Reface.NPI 中的各种功能。
基本规则
- 方法名称以 Insert , Delete , Select , Update 开头
- 方法名以数个单词构成,关键字、字段、操作符、参数名都是一个单词
- 每个单词以大写开头,其余全小写
- UserName 会被认作两个单词
- Username 会被认作一个单词
- 使用入参填充 Sql参数 时,不计大小写,你可以用 id 填充 @Id 的值
1 Insert 规则
仅使用 Insert 将使用实体中的所有字段的值写入。
void Insert(Entity entity);
开发者也可以通过 Without 关键字排除一些字段的写入,特别是那些依赖数据库本身的字段。
下面的例子不会对 Id 和 CreateTime 字段写入
bool InsertWithoutIdCreatetime(User user);
2 Delete 规则
Delete 方法名包含一个 条件规则。
条件规则 允许开发者定义一个 where 子语。
2.1 使用 By 声明一个 条件规则
要在方法名中声明一个条件,必须以 By 作为开始。
下面的方法,将会生成 where Id = @Id , 并以入参的 id 作为 @Id 的值。
void DeleteById(int id);
2.2 使用 And 和 Or 合并多个条件
你也可以使用 And 和 Or 合并多个条件
下面两个方法将会生成 where Id = @Id and/or Name = @Name 并以入参的 id 和 name 分别作用 @Id 和 @Name 的值。
bool DeleteByIdAndName(int id, string name)
bool DeleteByIdOrName(int id, string name)
注意
- 因为没有想到一个好的方法可以对条件进行分组,所以目前不可以声明条件组,形如 where ( Id = @Id and Name = @Name ) or ( State = @State and Loginname = @Loginname )。
如果您有好的想法,您也可以告诉我,共同完善 Library 。非常期待您的分享,感谢!
2.3 更多的操作符
很明显,我们不可能总是用 = 作为条件的判断操作,
我们还有 大于,小于,Like等等。
你可以在字段名后面加上操作符来实现此功能。
下面的例子会生成 where Name Like @Name 的条件。
int DeleteByNameLike(string name)
目前系统中支持的操作符有
| Sql | Method |
|---|---|
| = | Is , Equal , Equals |
| > | Greaterthan , Gt |
| >= | Greaterthanandequals , Gteq |
| < | Lessthan , Lt |
| <= | Lessthanandequals , Lteq |
| Like | Like , Likes |
| In | In |
2.4 自定义参数名
在上面的例子中,参数名直接与字段名相同。
我们也可以在操作符后加上参数名来改名这个默认的参数名。
下面的例子会生成 where Password Like @Badpassworda Or Password Like @Badpasswordb
int DeleteByPasswordLikeBadpasswordaOrPasswordLikeBadpasswordb(string badPasswordA, string badPasswordB);
3 Update 规则
Update 规则由两个部分组成
- 条件规则 ( 与 Delete 规则相同)
- Set 规则
Set 规则
3.1 指定 set 的字段
Update 关键字后接的部分,一直到 By 之前,都是 Set 的字段。
下面的例子会生成 set Password = @Password where Id = @Id
void UpdatePasswordById(int id, string password);
3.2 多个 set
你可以用 And 连接多个 set。
下面的例子会生成 set Password = @Password , Changingtime = @Changingtime where Id = @Id。
bool UpdatePasswordAndChangingtimeById(int id, string password, DateTime changingTime);
3.3 自定义 set 参数
和 条件规则 一样,生成的语句中,会默认使用字段名作为参数名。
你也可以在字段后添加 Equals 再加上 参数名称 来自定义参数名。
下面的例子会生成 set Count = @Newcount where Id = @Id And Count = @Oldcount
int UpdateCountEqualsNewcountByIdAndCountIsOldcount(int id, int oldCount, int newCount);
3.4 不指定 set 子句
当没有 set 子句的时候,
会以排除了 By 子句的条件后的所有字段作为 set 子句。
下面的例子会生成 update [user] set name = ?, password = ? where id = ?
// User : Id, Name, Password
int UpdateById(int id, User user);
若表中还有一些字段在 Update 时即不是条件,也不打算更新。可以使用 Without 关键字指定。
下面的例子中,User 包含四个属性
- Id
- Name
- Password
- CreateTime
// 下面的语句不会对 CreateTime 进行更新
void UpdateWithoutCreatetimeById(int id, User user);
4 Select 规则
Select规则 包含以下三个规则
- 条件规则 ( 与 Delete 和 Update 相同 )
- 输出字段规则
- 排序规则
- 分页查询
4.1 输出字段
这个规则比较简单,
只要把字段列在 Select 后即可,
多个字段可以用 And 连接。
输出字段是可选的,你可以跳过这个部分直接编写条件。
IList<Entity> SelectIdAndNameAndCreatetime();
4.2 条件规则
与 Update 和 Delete 一样,使用 By 关键字开始条件子句
User SelectById(int id);
4.3 排序规则
4.3.1 Orderby 子句
排序规则是由关键字 Orderby 开头的 ( 除了 O 都是 小写 )。
下面的例子会生成 ORDER BY Id Asc / Desc
IList<Entity> SelectOrderbyId();
IList<Eneity> SelectOrderbyIdDesc();
4.3.2 多个排序
多个排序不需要使用 And 连接,直接拼接即可。
IList<User> SelectOrderbyUsernameCreatetime();
4.3.3 分页查询
为 Select 方法前加上 Paging 就可以使用分页查询功能。
注意
- 使用分页查询时,必须提供类型为 Paging 的参数。
IList<Order> PagingSelectByCreatetimeGt(DateTime createTime);
使用基于 Reface.AppStarter 开发的 Reface.AppStarter.NPI 你可以不避手动创建代理类,
只需要通过构造函数注入那些实现了 NPI 的接口,就可以直接对数据库进行增删改查的操作了。
在后面的文章中,会介绍 Reface.AppStarter.NPI 的功能和使用方法。
相关链接
关注公众平台【清水潭】,可以查阅更多资料
Reface.NPI 方法名称解析规则详解的更多相关文章
- SVN权限解析规则详解(转)
首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先抛开alias和groups不谈,将重点放在路径的权限配置上. 一. 权限格式 svn权限的基本 ...
- 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)
简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...
- 53个Oracle语句优化规则详解(转)
Oracle sql 性能优化调整 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种:a. RULE (基于规则) b. COST (基于成本) c. CHOOSE ...
- Nginx 常用全局变量 及Rewrite规则详解
每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...
- ESLint 规则详解(二)
接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...
- Apache Rewrite 规则详解
在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- QuantLib 金融计算——基本组件之天数计算规则详解
目录 天数计算规则详解 定义 30 / 360 法 30/360 US 30/360 Bond Basis 30E/360 30E/360 ISDA Actual 法 Actual/Actual IC ...
随机推荐
- 从String到==和hashcode
public static void main(String[] args) { String s1 = "ni"; String s2 = "hao"; St ...
- vue中eslint报错的解决方案
1,Newline required at end of file but not found. (eol-last) //文末需要一行 这个是报错: 这个是不报错的: 只需要在最后一行加上一空行即可 ...
- vue环境搭建过程中,npm权限不足问题
今天在用git bash进行全局安装vue-cli的时候,报错: 必须以管理员权限进行安装才行.所以用cmd命令工具,点击右键命令提示符cmd--------以管理员身份运行--------cd进入到 ...
- Core + Vue 后台管理基础框架0——开篇
1.背景 最近,打算新开个项目,鉴于团队技术栈,选型.net core + vue,前后端分离.本打算捡现成的轮子的,github上大致逛了逛,总发现这样那样的不太适合心中那些“完美实践”,例如:Ab ...
- Python卸载
前言 自己瞎折腾下载Python3.8.2,把之前下载好的python3.7.3覆盖掉.在运行之前Python环境的程序多次未果后.找到原因,Python3.7.3的包不支持Python3.8.2.于 ...
- 设计模式之委派模式,大名鼎鼎的Spring都在用
什么是委派模式 虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式. "委派"字面意思就是指派一件事情给某人.类比到生活中的场景,比如项目leader指 ...
- ggplot2(4) 用图层构建图像
4.1 简介 qplot()的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层.每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中. 一个图 ...
- Python - 函数形参之必填参数、缺省参数、可变参数、关键字参数的详细使用
Python函数形参 必传参数:平时最常用的,必传确定数量的参数 缺省参数:在调用函数时可以传也可以不传,如果不传将使用默认值 可变参数:可变长度参数 关键字参数:长度可变,但是需要以kv对形式传参 ...
- str的常用方法
注:s表示定义的一个字符串变量,如:s = 'hello string' 1. s.index() 查找元素,若查到则返回该元素索引,含多个该元素则返回第一个,查不到则报错 s = 'hello ...
- C结构体与链表
今天来总结C语言的学习盲点--结构体,为了不显单一,也为了补足作者链表的编程缺陷,特更此博文,总结近段时间的学习成果.话不多说,先上一段代码 struct none{int item; link ne ...