理想中的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吗?如 ...
随机推荐
- 最小生成数kruskal算法和prim算法
定义 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图. 连通网:在 ...
- POJ:3684-Physics Experiment(弹性碰撞)
Physics Experiment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3392 Accepted: 1177 Sp ...
- Python 文本挖掘:使用情感词典进行情感分析(算法及程序设计)
出处:http://www.ithao123.cn/content-242299.html 情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪. 原理 比如 ...
- sql查询作业答案
sql查询作业答案 阅读目录 一 题目 二 答案 一 题目 1.查询所有的课程的名称以及对应的任课老师姓名 2.查询学生表中男女生各有多少人 3.查询物理成绩等于100的学生的姓名 4.查询平均成 ...
- 3714: [PA2014]Kuglarz
3714: [PA2014]Kuglarz 链接 思路: 好题.对于每个点都需要确定它的值,那么一个点可以直接询问[i,i]来确定,或者已经知道了[i,j]和[i+1,j]推出来. 但是可能产生冲突, ...
- 23、php知识点总结基础教程--part-1
1.基本语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾 <?php // 此处是 PHP 代码 ?> PHP 文件的默认文件扩展 ...
- [转]unity之LOD
LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型. 它的好处是可以在适当的时候大量减少需要绘制的顶点数目. 它的缺点 ...
- [类和对象]3 C++面向对象模型初探
? C++编译器如何完成面向对象理论到计算机程序的转化? [C++编译器是如何管理类.对象.类和对象之间的关系] 通过下面的代码,我们可以的得出:C++类对象中的成员变量和成员函数是分开存储的 成员变 ...
- mongodb 部署
安装mongodb-3.4 1)将安装包上传至服务器 2)对压缩文件进行解压 tar -zxvf mongodb-linux-x86_64-suse12-v3.4-latest.tar.gz 3)把解 ...
- Application_Start事件中用Timer做一个循环任务
protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new Syste ...