lamber表达式sql_(.NET Framework)Lambda表达式转换为sql

这个博客介绍了如何使用LambdaToSqlHelper类将C#的Lambda表达式转换为SQL语句。该类能够处理二元表达式、成员表达式、新数组表达式、方法调用表达式以及常量表达式,并提供了将表达式类型的节点类型转换为SQL关键字的功能。此外,还定义了一些用于特定SQL操作的方法,如IN、NOT IN、LIKE和NOT LIKE。
摘要由CSDN通过智能技术生成

///

/// 表达式转sql帮助类

///

public static class LambdaToSqlHelper

{

///

/// 从表达式获取sql

///

///

///

///

public static string GetSqlFromExpression(Expression> func)

{

if (func != null && func.Body is BinaryExpression be)

{

return BinarExpressionProvider(be.Left, be.Right, be.NodeType);

}

else

{

return " ( 1 = 1 ) ";

}

}

///

/// 拆分、拼接sql

///

///

///

///

///

static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type)

{

string sb = "(";

sb += ExpressionRouter(left);

sb += ExpressionTypeCast(type);

string tmpStr = ExpressionRouter(right);

if (tmpStr == "null")

{

if (sb.EndsWith(" =")) sb = sb.Substring(0, sb.Length - 2) + " is null";

else if (sb.EndsWith("<>")) sb = sb.Substring(0, sb.Length - 2) + " is not null";

}

else sb += tmpStr;

return sb += ")";

}

///

/// 拆分、拼接sql

///

///

///

static string ExpressionRouter(Expression exp)

{

string sb = string.Empty;

if (exp is BinaryExpression be)

{

return BinarExpressionProvider(be.Left, be.Right, be.NodeType);

}

else if (exp is MemberExpression me)

{

return me.Member.Name;

}

else if (exp is NewArrayExpression ae)

{

StringBuilder tmpstr = new StringBuilder();

foreach (Expression ex in ae.Expressions)

{

tmpstr.Append(ExpressionRouter(ex));

tmpstr.Append(",");

}

return tmpstr.ToString(0, tmpstr.Length - 1);

}

else if (exp is MethodCallExpression mce)

{

var attributeData = mce.Method.GetCustomAttributes(typeof(ToSqlFormat), false).First();

return string.Format(((ToSqlFormat)attributeData).Format, ExpressionRouter(mce.Arguments[0]), ExpressionRouter(mce.Arguments[1]));

}

else if (exp is ConstantExpression ce)

{

if (ce.Value == null)

return "null";

else if (ce.Value is ValueType)

return ce.Value.ToString();

else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)

return string.Format("'{0}'", ce.Value.ToString());

}

else if (exp is UnaryExpression)

{

UnaryExpression ue = ((UnaryExpression)exp);

return ExpressionRouter(ue.Operand);

}

return null;

}

///

/// 介绍表达式树节点的节点类型 转换为 sql关键字

///

///

///

static string ExpressionTypeCast(ExpressionType type)

{

switch (type)

{

case ExpressionType.And:

return " & ";

case ExpressionType.AndAlso:

return " AND ";

case ExpressionType.Equal:

return " =";

case ExpressionType.GreaterThan:

return " >";

case ExpressionType.GreaterThanOrEqual:

return ">=";

case ExpressionType.LessThan:

return "

case ExpressionType.LessThanOrEqual:

return "<=";

case ExpressionType.NotEqual:

return "<>";

case ExpressionType.Or:

return " | ";

case ExpressionType.OrElse:

return " Or ";

case ExpressionType.Add:

case ExpressionType.AddChecked:

return "+";

case ExpressionType.Subtract:

case ExpressionType.SubtractChecked:

return "-";

case ExpressionType.Divide:

return "/";

case ExpressionType.Multiply:

case ExpressionType.MultiplyChecked:

return "*";

default:

return null;

}

}

[ToSqlFormat("{0} IN ({1})")]

public static bool In(this T obj, T[] array)

{

return true;

}

[ToSqlFormat("{0} NOT IN ({1})")]

public static bool NotIn(this T obj, T[] array)

{

return true;

}

[ToSqlFormat("{0} LIKE {1}")]

public static bool Like(this string str, string likeStr)

{

return true;

}

[ToSqlFormat("{0} NOT LIKE {1}")]

public static bool NotLike(this string str, string likeStr)

{

return true;

}

}

public class ToSqlFormat : Attribute

{

public string Format { get; set; }

public ToSqlFormat(string str)

{

Format = str;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值