惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
S
SegmentFault 最新的问题
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
DataBreaches.Net
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
宝玉的分享
宝玉的分享
腾讯CDC
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
T
The Exploit Database - CXSecurity.com
T
The Blog of Author Tim Ferriss
V
V2EX
S
Securelist
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Y
Y Combinator Blog
P
Proofpoint News Feed
T
Tor Project blog
AWS News Blog
AWS News Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
博客园 - 聂微东
T
Threat Research - Cisco Blogs
B
Blog
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
N
News and Events Feed by Topic
博客园 - 司徒正美
H
Help Net Security
C
Cisco Blogs
C
Check Point Blog
S
Secure Thoughts

博客园 - 随风

最后期限 修改KMP的Next函数 Sql Prompt Sql懒人助手 99:87 Oh no no no i'm a rocket man NBA 08-09 会考 新书到 涂鸦(3)雨点大, 伞子小 涂鸦(2)人妖 最美丽的光华和一张厚实的医保卡 涂鸦(1) ---- 理想 辞职牛信 Where the Next Happen? 盘龙峡 Mac DockMenu 众里寻 E心情 英语面板 生活死锁
Sql拼凑器
随风 · 2008-01-08 · via 博客园 - 随风

        实现复杂的数据查询一般是用Sql来拼凑或写存储过程, 大部分ORM都比较勉强或比较复杂,
        最近的又要实现复杂的数据查询, 实在不想拼凑Sql, 于是自己搞了一个用XML描述的Sql拼凑器。
        主要的思路是把变化的部分都当作参数, 不变的部分按照Sql一样分成几块,这样业务改变的时候只需要
        改变传进去的参数就可以了,当然还要有非常手段来处理变态需要了。
        调用的时候还可以通过3个接口,IUserContext, IPreHandle, IPostHandle实现外部的特殊处理, 例如权限。
        现在只要把XML配置好,调用的时候改改参数就OK了,真舒服...
        具体如下图:


 
XML例子:

<?xml version="1.0" encoding="utf-8" ?>
<QuerySQL>
 <!--每一个Name表示唯一的一个对象
 CmdType为Text表示一般文本, StoredProcedure表示存储过程
 ReLoad为真的时候表示每次都重新加载该文档,否则采用缓存的结构
 -->
 <Add Name="Query1" Type="Text"  ReLoad="False">
  <Select>
   Select * From Table a
  </Select>
  <Joins>
   <!--子连接, 可以直接连表(如join1)或连子查询(如join2)
  Type表示连接类型, On表示连接条件, Conditions表示子查询对应的条件-->
   <Add Name="join1" Type="Left Join"  JoinTable=" Table b " On="on a.ID = b.ID">
   </Add>
   <Add Name="join2" Type="Join"  JoinTable=" (Select Distinct ID From Table c {Conditions}) c " On="on c.ID = a.ID">
    <Conditions>
     <!--Sentence表示该条件的语句,Parameter对应于查询参数和可设置的值
     “|”表示该语句在它里面的参数
     当设置了NullValue并且赋予的值=NullValue则该参数对应的一块查询将忽略
     DefaultValue表示没有设置参数的时候用该值
     Sentence里面的参数用{参数名}来替换真实的参数值
     参数类型:String, Number, DateTime, ExString, VarString
     -->
     <Add Name="conn1" Sentence=" and Pro1 = {Pro1} and Pro2 = {Pro2} | and Pro3 = {Pro3}">
      <Parameter Name="Pro1" Type="Number"></Parameter>
      <Parameter Name="Pro2" Type="DateTime"></Parameter>
      <Parameter Name="Pro3" Type="String" NullValue=""  DefaultValue="Pro3"></Parameter>
     </Add>
    </Conditions>
   </Add>
  </Joins>
  <Conditions>
   <Add Name="conn1" Sentence=" and Pro1 = {Pro1} and Pro2 = {Pro2}">
    <Parameter Name="Pro1" Type="Number"></Parameter>
    <Parameter Name="Pro2" Type="String"></Parameter>
   </Add>
  </Conditions>
  <!--GroupBy和OrderBy当有设置的时候则添加-->
  <GroupBy>
   <Conditions>
    <Add Name="conn1" Sentence=" {Pro1} | {Pro2}">
     <Parameter Name="Pro1" Type="String" DefaultValue="Pro1"></Parameter>
     <Parameter Name="Pro2" Type="String" DefaultValue="Pro2"></Parameter>
    </Add>
   </Conditions>
  </GroupBy>
  <OrderBy>
   <Conditions>
    <Add Name="conn1" Sentence=" {Pro1} | {Pro2}">
     <Parameter Name="Pro1" Type="String" DefaultValue="Pro1"></Parameter>
     <Parameter Name="Pro2" Type="String" DefaultValue="Pro2"></Parameter>
    </Add>
   </Conditions>
  </OrderBy>
 </Add>
</QuerySQL>

<!--调用方式:
CCustomQueryBase objQuery = CQueryService.GetQuery("Name", XmlPath, EQueryType.MSSQL);
//设置子查询

objQuery.Select.SetConditionPara<Int32>("conn1", "Pro1", 1);//没有条件的时候传空字符
objQuery.Select.SetConditionPara<String>("conn1", "Pro3", "Pro3");//设置对应的条件和参数,当参数值=预先设置的NullValue表示忽略该参数

objQuery.Joins["join2"].SetConditionPara<Int32>("conn1", "Pro1", 1);
objQuery.Joins["join2"].SetConditionPara<DateTime>("conn1", "Pro2", dtPro2);
objQuery.Joins["join2"].SetConditionPara<String>("conn1", "Pro3", "Pro3");


objQuery.ToSql();//就得到最后结果
-->