博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Expression 转化为sql(三) --自定义函数
阅读量:7152 次
发布时间:2019-06-29

本文共 3133 字,大约阅读时间需要 10 分钟。

  SQL 语句有很多函数如len(),now()等等。如何来生成这些函数。最近研究也写办法共大家参考。

      一.首先建立一个建一个扩展类,控制只能允许这些函数出现,如果出现其他函数就直接报异常。

1  public static class SQLMethods 2     { 3         public static bool DB_In
(this T t, List
list) // in 4 { 5 return true; 6 } 7 public static Boolean DB_NotIn
(this T t, List
list) // not in 8 { 9 return true;10 }11 public static int DB_Length(this string t) // len();12 {13 return 0;14 }15 public static bool DB_Like(this string t, string str) // like16 {17 return true;18 }19 public static bool DB_NotLike(this string t, string str) // not like 20 {21 return true;22 }23 }
View Code

   我们要生成sql,那么函数的返回值没有意思,len() ,like,和not 只能针对字符串类型, in 和not in 可以针对所有类型。

  二.处理不同函数相关的逻辑。

     1.判断函数所在类的命名空间是否我是我们要求的。

       2.根据函数名处理。出现意外函数抛出异常

    代码如下"

1  private string DealMethodsCall(MethodCallExpression m_exp) 2         { 3             var k = m_exp; 4             var g = k.Arguments[0]; 5             /// 控制函数所在类名。 6             if (k.Method.DeclaringType != typeof(SQLMethods)) 7             { 8                 throw new Exception("无法识别函数"); 9             }10             switch (k.Method.Name)11             {12                 case "DB_Length":13                     {14                         var exp  = k.Arguments[0];15                         return "LEN(" + DealExpression(exp) + ")";16                     }17                 case "DB_In":18                 case "DB_NotIn":19                     {20                         var exp1 = k.Arguments[0];21                         var exp2 = k.Arguments[1];22                         string methods = string.Empty;23                         if (k.Method.Name == "In")24                         {25                             methods = " IN ";26                         }27                         else28                         {29                             methods = " NOT IN ";30                         }31                         return DealExpression(exp1) + methods + DealExpression(exp2);32                     }33                 case "DB_Like":34                 case "DB_NotLike":35                     {36                         var exp1 = k.Arguments[0];37                         var exp2 = k.Arguments[1];38                         string methods = string.Empty;39                         if (k.Method.Name == "DB_Like")40                         {41                             methods = " LIKE ";42                         }43                         else44                         {45                             methods = " NOT LIKE ";46                         }47                         return  DealExpression(exp1) + methods + DealExpression(exp2);48 49                     } 50             }51             ///   未知的函数52             throw new Exception("意外的函数");53         }
处理相关函数

    三. 调试结果

  

  最近把ExpressionToSQL 类已整理出来,供大家下载参考。

 

转载于:https://www.cnblogs.com/linxingxunyan/p/McKay.html

你可能感兴趣的文章
GPIO推挽输出和开漏输出详解
查看>>
事务处理和并发控制
查看>>
I18N、L10N、G11N
查看>>
引用类中的enum
查看>>
【转】Android开源项目发现---ListView篇(持续更新)
查看>>
利用锚点制作简单索引效果
查看>>
影响网站打开速度的9大因素
查看>>
HTML5之废弃和更新的元素与属性
查看>>
[转]asp.net解决高并发的方案.
查看>>
(转)unity中基于alpha通道的shadow volume实现
查看>>
linux下svn的co如何排除目录
查看>>
项目中最常用到的颜色
查看>>
[转]10个学习Android开发的网站推荐
查看>>
【linux驱动分析】之dm9000驱动分析(六):dm9000_init和dm9000_probe的实现
查看>>
交大人在各行各业一直不懈追逐着自己的创业梦想,如携程网、
查看>>
CI框架 -- 开发环境、生产环境
查看>>
命令行解析器
查看>>
Aqua Data Studio 查询结果中文乱码
查看>>
2016第21周三问题记录
查看>>
页面中多个script块之间的关系
查看>>