• Expression 转化为sql(三) --自定义函数


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

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

     1  public static class SQLMethods
     2     {
     3         public static bool DB_In<T>(this T t, List<T> list)  // in
     4         {
     5             return true;
     6         }
     7         public static Boolean DB_NotIn<T>(this T t, List<T> 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) // like
    16         {
    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                         else
    28                         {
    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                         else
    44                         {
    45                             methods = " NOT LIKE ";
    46                         }
    47                         return  DealExpression(exp1) + methods + DealExpression(exp2);
    48 
    49                     } 
    50             }
    51             ///   未知的函数
    52             throw new Exception("意外的函数");
    53         }
    处理相关函数

        三. 调试结果

      

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

    ExpressionToSQL.zip 下载

  • 相关阅读:
    nginx 配置https, 服务器是阿里云的ECS(亲测)
    jenkins 安装2.170版本 的问题汇中
    终于有人把“TCC分布式事务”实现原理讲明白了!
    springcloud(九) springboot Actuator + admin 监控
    springcloud(八) Hystrix监控
    springcloud(七) feign + Hystrix 整合 、
    springboot 2.0 自定义redis自动装配
    springboot 2.0 自动装配原理 以redis为例
    博文分类索引--Python
    【python】-- Ajax
  • 原文地址:https://www.cnblogs.com/linxingxunyan/p/McKay.html
Copyright © 2020-2023  润新知