理想中的SQL语句条件拼接方式 (二)
问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 。
效果
现在有2个类映射数据库的2张表,结构如下:
public class User
{
public int UserID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool IsGirl { get; set; }
public DateTime LoginTime { get; set; }
} public class Log
{
public int UserID { get; set; }
public string Content { get; set; }
public int LogID { get; set; }
public DateTime CreateTime { get; set; }
public bool IsCreasy { get; set; }
}
首先我们可能需要查询用户信息(单表查询),条件不定。来看看我们要写的代码:
var dic = new Dictionary<string, object>();
dic["BeginAge"] = "";//Age>=18
dic["EndAge"] = ;//Age<=80
dic["LikeName"] = "玲";//Name包含'玲'
dic["IsGirl"] = "true";//IsGirl = true
dic["BeginLoginTime"] = DateTime.Now.AddDays(-);//LoginTime >= 七天前
dic["EndLoginTime"] = DateTime.Now.ToString();//LoginTime <= 今天
//类型映射
SqlMapper mapper = new SqlMapper();
mapper.SelectSingle<User>(dic, "t1");
我们可以由此得到拼接后的SQL语句,看看通过Mapper得到的SQL语句是什么样子。
t1.Age >= @BeginAge AND t1.Age <= @EndAge
AND t1.Name like '%'+@Name+'%' AND t1.IsGirl = @IsGirl
AND t1.LoginTime >= @BeginLoginTime AND t1.LoginTime <= @EndLoginTime
然后参数存储在Dictionary<string,object>对象中,参数则是经过通过User类型映射后的。
对于单表查询,可以直接在C#代码中这样写查询条件,也可以是由页面构造的Json传递后台,通过反序列化得到的Dictionary<string,object>对象。
下面我们来看看联合查询下条件怎么写。假定SQL语句是这样:
select * from User t1 inner join Log t2 on t1.UserID=t2.UserID where
最终我是希望通过Js直接将参数传递给后台,构造条件与参数,然后将条件与该SQL语句进行拼接,交给ado或者orm去执行。由于是联表查询,可能需要通过映射多个类型,所以我使用了如下数据结构:Dictionary<string,Dictionary<string,object>> , 意思则是实体与实体条件的一个字典集合。
首先在C#端构造该数据结构及调用方式。
dicMulty["t1"] = new Dictionary<string, object>();
dicMulty["t1"]["UserID"] = "";
dicMulty["t1"]["Name"] = "xxx";
dicMulty["t1"]["BeginAge"] = "";//Age>=18
dicMulty["t1"]["EndAge"] = ;//Age<=80
dicMulty["t1"]["LikeName"] = "玲";//Name包含'玲'
dicMulty["t1"]["IsGirl"] = "true";//IsGirl = true
dicMulty["t1"]["BeginLoginTime"] = DateTime.Now.AddDays(-);//LoginTime >= 七天前
dicMulty["t1"]["EndLoginTime"] = DateTime.Now.ToString();//LoginTime <= 今天
dicMulty["t2"] = new Dictionary<string, object>();
dicMulty["t2"]["LogID"] = "";
dicMulty["t2"]["UserID"] = "";
dicMulty["t2"]["LikeContent"] = "坏事";//Age>=18
dicMulty["t2"]["IsCreasy"] = "false";//Age<=80
dicMulty["t2"]["CreateTime"] = "2013-11-05 10:52:37";//
mapper.SelectMulity<User, Log>(dicMulty, "t1", "t2");
看看生成的SQL语句,其中条件中故意在t1表,和t2表,均使用了UserID查询。
t1.UserID = @UserID AND t1.Name = @Name
AND t1.Age >= @BeginAge AND t1.Age <= @EndAge
AND t1.Name like '%'+@Name+'%' AND t1.IsGirl = @IsGirl
AND t1.LoginTime >= @BeginLoginTime AND t1.LoginTime <= @EndLoginTime
AND t2.LogID = @LogID AND t2.UserID = @UserID1
AND t2.Content like '%'+@Content+'%' AND t2.IsCreasy = @IsCreasy
AND t2.CreateTime = @CreateTime
但是在目前的场景中,经常是由Js将条件传递过来,我们看看Js端是怎么调用的呢。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="jquery-1.7.1.min.js"></script>
<%--<script src="jquery.json-2.4.min.js"></script>--%>
</head>
<script>
function test() {
var a = { t1: {}, t2: {} };
a.t1.UserID = "1";
a.t1.Name = "xxx";
a.t1.BeginAge = "18";
a.t1.EndAge = 80;
a.t1.LikeName = "玲";
a.t1.IsGirl = "true";
a.t1.BeginLoginTime = "2013-10-01 11:22:13";//
a.t1.EndLoginTime = "2013-11-05 11:22:23";//
a.t2.LogID = "1";
a.t2.UserID = "1";
a.t2.LikeContent = "坏事";
a.t2.IsCreasy = false;
a.t2.CreateTime = new Date();
var json = JSON.stringify(a);
$.post("Handler1.ashx",
{ "para": json }, function (data) {
alert(data);
}, 'json');
}
</script> <body>
<form id="form1" runat="server">
<div>
<input type="button" value="测试" onclick="test()" />
</div>
</form>
</body>
</html>
目前可能在单表、或者联合查询上,满足了我的需求。
最后我想,如果在实际应用中,可能我想直接在后台写条件,根本就不需要做什么类型映射,按照命名规则条件,直接把条件拼接出来就好了。在单表查询上都好说,像前面介绍的方式来写,倒也不麻烦,可联合查询,如果像前面写的,那样太麻烦了,还不如直接拼接SQL去,所以想了想,整成如下模样:
dic["t1.UserID"] = ;
dic["t1.Name"] = "xxx";
dic["t1.BeginAge"] = ;//Age>=18
dic["t1.EndAge"] = ;//Age<=80
dic["t1.LikeName"] = "玲";//Name包含'玲'
dic["t1.IsGirl"] = true;//IsGirl = true
dic["t1.BeginLoginTime"] = DateTime.Now.AddDays(-);//LoginTime >= 七天前
dic["t1.EndLoginTime"] = DateTime.Now.ToString();//LoginTime <= 今天
dic["t2.LogID"] = ;
dic["t2.UserID"] = ;
dic["t2.LikeContent"] = "坏事";//Age>=18
dic["t2.IsCreasy"] = false;//Age<=80
dic["t2.CreateTime"] = DateTime.Parse("2013-11-05 10:52:37");
mapper.Select(dic);
拼接得到的SQL和之前是一样,这里就不反复贴了。
大伙看看这样是否可行呢。
理想中的SQL语句条件拼接方式 (二)的更多相关文章
- 理想中的SQL语句条件拼接方式
背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...
- MyBatis中动态SQL语句完成多条件查询
一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...
- [转帖]关于Java中SQL语句的拼接规则
关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...
- 在Excel中使用SQL语句查询和筛选
本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...
- [转]在EntityFramework6中执行SQL语句
本文转自:http://www.cnblogs.com/wujingtao/p/5412329.html 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有 ...
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- 在EntityFramework6中执行SQL语句
在EntityFramework6中执行SQL语句 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语 ...
- 在EF中执行SQL语句(转载)
在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...
- 在EntityFramework6中执行SQL语句【转】
在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语句. 你可能要问,我用EF不就为了避免写SQL吗?如 ...
随机推荐
- python学习之路1(基本语法元素)
1.变量与简单数据类型 1.1变量 变量就是给你所写代码的信息起一个名字,用来存储此信息,使信息变得更加的简洁易读, 例如:message = "Hello World!",其中m ...
- L2-029 特立独行的幸福 (25 分)
L2-029 特立独行的幸福 (25 分) 对一个十进制数的各位数字做一次平方和,称作一次迭代.如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数.1 是一个幸福数.此外,例如 19 经过 ...
- python-7面向对象高级编程
1-给类动态增加方法 class Student(object): pass def set_score(self, score): self.score = score Student.set_sc ...
- 笔记-scrapy-scarpyd
笔记-scrapy-scarpyd 1. scrapy部署 会写爬虫之后就是部署.管理爬虫了,下面讲一下如何部署scrapy爬虫. 现在使用较多的管理工具是Scrapyd. scrapyd是 ...
- Flume是什么
分布式流式实时收集日志文件系统,便于实时在线的流式计算,常配合 Storm 和 spark streming 使用. Flume is a distributed分布式的, reliable可靠的, ...
- SpringMVC---其它常用注解
常用注解 PathVariable @RequestMapping注解中使用占位符的情况下,需要使用@PathVariable注解指定占位符参数.即指定占位符中的值与方法中哪一个参数进行匹配.如果方法 ...
- MySQL权限管理创建帐户
权限管理 1.创建账号 # 本地账号 create user 'egon1'@'localhost' identified by '123'; # mysql -uegon1 -p123 # 远程帐号 ...
- P1133 教主的花园
P1133 教主的花园 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教 ...
- WebApi实现Ajax模拟Multipart/form-data方式多文件上传
前端页面代码: <input type="file" class="file_control" /><br /> <input t ...
- Jenkins拾遗--第二篇(初步配置Jenkins)
插件配置 第一次安装Jenkins的时候会让你配置插件.这里有一个建议:就是把所有插件都看一遍,如果用不到,就不要勾选.Jenkins插件兼容性有的时候不是很好,多装多出事儿,保持最小集就好.浏览一遍 ...