理想中的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吗?如 ...
随机推荐
- 使用postMan测试insert或者update接口
URL : http://localhost:8099/orderVoice/updateAgentLogin?access_token=7f10e803-f886-47df-b3dc-9ed307d ...
- SpringMVC文件上传——bean的配置【org.springframework.web.multipart.commons.CommonsMultipartResolver】
一.简介 Spring MVC支持一个通用的多路上传解析器CommonsMultipartResolver,在Spring的配置文件中对CommonsMultipartResolver Bean进行配 ...
- [WC2002][洛谷P1578]奶牛浴场
洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...
- python lamba表达式
lambda函数也叫匿名函数,即,函数没有具体的名称. g=lambda x:x**2 def f(x): return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是 ...
- pg数据库数据表异常挂起
pg数据库即是PostgreSQL数据库. 前几天在一个Java项目中,出现运行Java程序后,pg数据库的数据表异常挂起.而且是在某台电脑上出现的,重装数据库也没用,其它电脑未能复现,是个很奇怪的现 ...
- 你是怎么封装一个view的
可以通过纯代码或者xib的方式来封装子控件 建立一个跟view相关的模型,然后将模型数据传给view,通过模型上的数据给view的子控件赋值 /** * 纯代码初始化控件时一定会走这个方法 */ - ...
- 从事IT业一个8年老兵转行前的自我总结2——从《易经》说开来
近些年一直在读<易经>,收获颇多.以前看不贯的人或物现在可以淡然看定,以前看不开的一些事现在也安然放下,以前看不透的某些事现在也都可看透八九不离十. 古人云:不读<易>不可为将 ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- python基础实践(一)
-*-纸上得来终觉浅,绝知此事要恭行.-*-# -*- coding:utf-8 -*-# Author:sweeping-monkname = "什么是字符串?"What_is_ ...
- Python全栈工程师 (exercises)
# 1:给定一个数,判断他是正数,负数,还是0 a = int(input("请输入一该个整数")) if a == 0: print(a, "是0") eli ...