zoukankan      html  css  js  c++  java
  • 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 下载

  • 相关阅读:
    《C++标准程序库》 第6章 STL Container
    《C++语言99个常见编程错误》
    单例模式
    《C++标准程序库》 第7章 Iterator Adapters
    Shell颜色封装(C++)
    《改善C++程序的150个建议》
    OpenCV之图片的创建、保存和复制
    XMLDOM对象方法:对象事件
    三国中最精辟的十句话
    中国十大名茶及鉴别方法
  • 原文地址:https://www.cnblogs.com/linxingxunyan/p/McKay.html
Copyright © 2011-2022 走看看