理想中的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"] = "18";//Age>=18
            dic["EndAge"] = 80;//Age<=80
            dic["LikeName"] = "";//Name包含'玲'
            dic["IsGirl"] = "true";//IsGirl = true 
            dic["BeginLoginTime"] = DateTime.Now.AddDays(-7);//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"] = "1";
            dicMulty["t1"]["Name"] = "xxx";
            dicMulty["t1"]["BeginAge"] = "18";//Age>=18
            dicMulty["t1"]["EndAge"] = 80;//Age<=80
            dicMulty["t1"]["LikeName"] = "";//Name包含'玲'
            dicMulty["t1"]["IsGirl"] = "true";//IsGirl = true 
            dicMulty["t1"]["BeginLoginTime"] = DateTime.Now.AddDays(-7);//LoginTime >= 七天前
            dicMulty["t1"]["EndLoginTime"] = DateTime.Now.ToString();//LoginTime <= 今天
            dicMulty["t2"] = new Dictionary<string, object>();
            dicMulty["t2"]["LogID"] = "1";
            dicMulty["t2"]["UserID"] = "1";
            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"] = 1;
            dic["t1.Name"] = "xxx";
            dic["t1.BeginAge"] = 18;//Age>=18
            dic["t1.EndAge"] = 80;//Age<=80
            dic["t1.LikeName"] = "";//Name包含'玲'
            dic["t1.IsGirl"] = true;//IsGirl = true 
            dic["t1.BeginLoginTime"] = DateTime.Now.AddDays(-7);//LoginTime >= 七天前
            dic["t1.EndLoginTime"] = DateTime.Now.ToString();//LoginTime <= 今天
            dic["t2.LogID"] = 1;
            dic["t2.UserID"] = 1;
            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和之前是一樣,這里就不反復貼了。

  大伙看看這樣是否可行呢。

  測試代碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM