当前位置:Gxlcms > 数据库问题 > Expression 转化为sql(三) --自定义函数

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

时间:2021-07-01 10:21:17 帮助过:16人阅读

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 下载

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

标签:cas   lap   public   display   针对   pre   method   closed   call   

人气教程排行