问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的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语句条件拼接方式 (二)的更多相关文章

  1. 理想中的SQL语句条件拼接方式

    背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...

  2. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  3. [转帖]关于Java中SQL语句的拼接规则

    关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...

  4. 在Excel中使用SQL语句查询和筛选

    本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...

  5. [转]在EntityFramework6中执行SQL语句

    本文转自:http://www.cnblogs.com/wujingtao/p/5412329.html 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有 ...

  6. sql语句分页多种方式ROW_NUMBER()OVER

    sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...

  7. 在EntityFramework6中执行SQL语句

    在EntityFramework6中执行SQL语句 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语 ...

  8. 在EF中执行SQL语句(转载)

    在EF中执行SQL语句   你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...

  9. 在EntityFramework6中执行SQL语句【转】

    在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语句. 你可能要问,我用EF不就为了避免写SQL吗?如 ...

随机推荐

  1. Python学习笔记:sqlite3(sqlite数据库操作)

    对于数据库的操作,Python中可以通过下载一些对应的三方插件和对应的数据库来实现数据库的操作,但是这样不免使得Python程序变得更加复杂了.如果只是想要使用数据库,又不想下载一些不必要的插件和辅助 ...

  2. Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    今天在连接mysql的时候出现了上面的错误, 很明显原因找不到/socket 文件 查了半天才发现原来是mysql没有开启 service  mysqld  start 开启之后在/tmp/目录下回自 ...

  3. [回文树][BZOJ2160][国家集训队]拉拉队排练

    题面 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮 ...

  4. mysql学习第三天练习(流程控制函数)

    -- 流程控制函数 -- 1.查询员工部门号,并赋予部门名 select empno,ename,deptno,case deptno then '10部门' then '20部门' else '30 ...

  5. Hive环境搭建及基本操作

    伪分布式 一.安装及配置Hive 1.配置HADOOP_HOME和Hive conf 目录hive-env.sh # Set HADOOP_HOME to point to a specific ha ...

  6. CodeForces 547E Mike and Friends AC自动机 主席树

    题意: 给出\(n\)个字符串\(s_i\)和\(q\)个询问: \(l,r,k\):\(\sum\limits_{i=l}^{r}count(i, k)\),其中\(count(i,j)\)表示\( ...

  7. React + webpack 快速搭建开发环境

    因网上大多React + webpack快速搭建的运行不起来,便自行写了一个.在搭建开发环境的前需安装nodejs,npm. 新建一个工作目录,比如叫reactdome,在reactdome目录中运行 ...

  8. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

  9. 【Random Forest】林轩田机器学习技法

    总体来说,林对于random forest的讲解主要是算法概况上的:某种程度上说,更注重insights. 林分别列举了Bagging和Decision Tree的各自特点: Random Fores ...

  10. python 读取数据库中文内容显示一堆问号

    需要在连接数据库时 设置编码格式 def select_db(self,db_name): self.conn = MySQLdb.connect( host = self.ip, port = se ...