Sql拼凑器
最近的又要实现复杂的数据查询, 实在不想拼凑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();//就得到最后结果
-->