理想中的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吗?如 ...
随机推荐
- Flask初学者:视图函数/方法返回值(HTML模板/Response对象)
返回HTML模板:使用“from flask import render_template”,在函数中传入相对于文件夹“templates”HTML模板路径名称字符串即可(默认模板路径),flask会 ...
- HyperLedger Fabric 1.4 比特币历史(1.1)
比特币是一种数字货币,也是一种创新思维,把人们带入到一个无中心化.完全可信任.安全可靠的全新思维领域:一个叫“中本聪”的人或组织,使我们思维产生化学反应,他在2008年10月31日发表了比特币白皮书& ...
- [Hdu1166]敌兵布阵(CQD分治)
CQQ分治 Code #include <cstdio> #include <cstring> #define N 50010 struct info{ int x,p,v; ...
- TP-常见错误1
1.无法加载模块 FILE: D:\wamp64\www\www.test_shop.com\ThinkPHP\Library\Think\Dispatcher.class.php LINE: 178 ...
- 路由vue-router进阶
目录 1. 导航守卫 1.1. 全局守卫 1.2. 全局解析守卫 1.3. 全局后置钩子 1.4. 路由独享的守卫 1.5. 组件内的守卫 1.6. 完整的导航解析流程 2. 路由元信息 3. 获取数 ...
- 《Cracking the Coding Interview》——第17章:普通题——题目11
2014-04-29 00:00 题目:给定一个rand5()函数,能够返回0~4间的随机整数.要求实现rand7(),返回0~6之间的随机整数.该函数产生随机数必须概率相等. 解法:自己想了半天没想 ...
- DOS程序员手册(一)
当今MS-Windows横扫大江南北,让我们这就来研究一下它的祖宗——MS-DOS! 这本书很难得,希望读者好好学习! DOS程序员手册(一) DOS教程 (以下内容全部为原作者的阐述,照样保留) 这 ...
- 关于用python作为第三方程序,来调用shell命令的问题,以及返回值格式解析
1.用python语言作为第三方,调用shell 在python2.x中,可以通过包commands来进行调用shell命令.如下: cmd就是你要调用的shell命令,把环境配置好,输入正确的命令格 ...
- SPOJ 149 FSHEEP Fencing in the Sheep ( 计算几何 + 二分 )
以下摘自SPOJ泛做表格: 题意:给定一个星形多边形,而且给出了一个可以看到形内所有点的位置(我们称这个点为观察点),让你判断有多少个点位于多边形内. 时间复杂度:O(mlogn) 将多边形上的点按极 ...
- 软工实践Alpha冲刺(10/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...