SQL 语句有很多函数如len(),now()等等。如何来生成这些函数。最近研究也写办法共大家参考。
一.首先建立一个建一个扩展类,控制只能允许这些函数出现,如果出现其他函数就直接报异常。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
我们要生成sql,那么函数的返回值没有意思,len() ,like,和not 只能针对字符串类型, in 和not in 可以针对所有类型。
二.处理不同函数相关的逻辑。
1.判断函数所在类的命名空间是否我是我们要求的。
2.根据函数名处理。出现意外函数抛出异常
代码如下"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 类已整理出来,供大家下载参考。