Sql拼凑器

        实现复杂的数据查询一般是用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();//就得到最后结果
-->


 

posted on 2008-01-08 14:02  随风  阅读(665)  评论(0编辑  收藏  举报