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

时间:2023-03-08 21:30:04

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

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

  public static class SQLMethods
{
public static bool DB_In<T>(this T t, List<T> list) // in
{
return true;
}
public static Boolean DB_NotIn<T>(this T t, List<T> list) // not in
{
return true;
}
public static int DB_Length(this string t) // len();
{
return ;
}
public static bool DB_Like(this string t, string str) // like
{
return true;
}
public static bool DB_NotLike(this string t, string str) // not like
{
return true;
}
}

  我们要生成sql,那么函数的返回值没有意思,len() ,like,和not 只能针对字符串类型, in 和not in 可以针对所有类型。

  二.处理不同函数相关的逻辑。

     1.判断函数所在类的命名空间是否我是我们要求的。

    2.根据函数名处理。出现意外函数抛出异常

    代码如下"

  private string DealMethodsCall(MethodCallExpression m_exp)
{
var k = m_exp;
var g = k.Arguments[];
/// 控制函数所在类名。
if (k.Method.DeclaringType != typeof(SQLMethods))
{
throw new Exception("无法识别函数");
}
switch (k.Method.Name)
{
case "DB_Length":
{
var exp = k.Arguments[];
return "LEN(" + DealExpression(exp) + ")";
}
case "DB_In":
case "DB_NotIn":
{
var exp1 = k.Arguments[];
var exp2 = k.Arguments[];
string methods = string.Empty;
if (k.Method.Name == "In")
{
methods = " IN ";
}
else
{
methods = " NOT IN ";
}
return DealExpression(exp1) + methods + DealExpression(exp2);
}
case "DB_Like":
case "DB_NotLike":
{
var exp1 = k.Arguments[];
var exp2 = k.Arguments[];
string methods = string.Empty;
if (k.Method.Name == "DB_Like")
{
methods = " LIKE ";
}
else
{
methods = " NOT LIKE ";
}
return DealExpression(exp1) + methods + DealExpression(exp2); }
}
/// 未知的函数
throw new Exception("意外的函数");
}

处理相关函数

三. 调试结果

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

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

ExpressionToSQL.zip 下载