• 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     }
    复制代码

       我们要生成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 下载

  • 相关阅读:
    LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
    第 15 篇:接口的单元测试
    【译】GitHub 为什么挂?官方的可行性报告为你解答
    微服务常用的几种部署方式——蓝绿部署,滚动升级,灰度发布/金丝雀发布
    .net生成PDF文件的几种方式
    读取私有字体信息并进行相关判断
    Windows Locale Codes
    总结C#获取当前路径的7种方法
    Devexpress aspxgridview oncustomcallback 无刷新更新数据
    ArcGIS Pro 版本、版本号、发布年代
  • 原文地址:https://www.cnblogs.com/chinasoft/p/16129178.html
Copyright © 2020-2023  润新知