usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Text;usingSystem.Threading.Tasks;namespaceMaiCore

{///

///

///

public classLambdaToSqlHelper

{///

///NodeType枚举///

private enumEnumNodeType

{///

///二元运算符///

[Description("二元运算符")]

BinaryOperator= 1,///

///一元运算符///

[Description("一元运算符")]

UndryOperator= 2,///

///常量表达式///

[Description("常量表达式")]

Constant= 3,///

///成员(变量)///

[Description("成员(变量)")]

MemberAccess= 4,///

///函数///

[Description("函数")]

Call= 5,///

///未知///

[Description("未知")]

Unknown= -99,///

///不支持///

[Description("不支持")]

NotSupported= -98}///

///判断表达式类型///

/// lambda表达式

///

private staticEnumNodeType CheckExpressionType(Expression exp)

{switch(exp.NodeType)

{caseExpressionType.AndAlso:caseExpressionType.OrElse:caseExpressionType.Equal:caseExpressionType.GreaterThanOrEqual:caseExpressionType.LessThanOrEqual:caseExpressionType.GreaterThan:caseExpressionType.LessThan:caseExpressionType.NotEqual:returnEnumNodeType.BinaryOperator;caseExpressionType.Constant:returnEnumNodeType.Constant;caseExpressionType.MemberAccess:returnEnumNodeType.MemberAccess;caseExpressionType.Call:returnEnumNodeType.Call;caseExpressionType.Not:caseExpressionType.Convert:returnEnumNodeType.UndryOperator;default:returnEnumNodeType.Unknown;

}

}///

///表达式类型转换///

///

///

private static stringExpressionTypeCast(ExpressionType type)

{switch(type)

{caseExpressionType.And:caseExpressionType.AndAlso:return "and";caseExpressionType.Equal:return "=";caseExpressionType.GreaterThan:return ">";caseExpressionType.GreaterThanOrEqual:return ">=";caseExpressionType.LessThan:return "";caseExpressionType.Or:caseExpressionType.OrElse:return "or";caseExpressionType.Add:caseExpressionType.AddChecked:return "+";caseExpressionType.Subtract:caseExpressionType.SubtractChecked:return "-";caseExpressionType.Divide:return "/";caseExpressionType.Multiply:caseExpressionType.MultiplyChecked:return "*";default:return null;

}

}private static string BinarExpressionProvider(Expression exp, ListlistSqlParaModel)

{

BinaryExpression be= exp asBinaryExpression;

Expression left=be.Left;

Expression right=be.Right;

ExpressionType type=be.NodeType;string sb = "(";//先处理左边

sb +=ExpressionRouter(left, listSqlParaModel);

sb+=ExpressionTypeCast(type);//再处理右边

string sbTmp =ExpressionRouter(right, listSqlParaModel);if (sbTmp == "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";

}elsesb+=sbTmp;return sb += ")";

}private static string ConstantExpressionProvider(Expression exp, ListlistSqlParaModel)

{

ConstantExpression ce= exp asConstantExpression;if (ce.Value == null)

{return "null";

}else if (ce.Value isValueType)

{

GetSqlParaModel(listSqlParaModel, GetValueType(ce.Value));return "@para" +listSqlParaModel.Count;

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

{

GetSqlParaModel(listSqlParaModel, GetValueType(ce.Value));return "@para" +listSqlParaModel.Count;

}return "";

}private static string LambdaExpressionProvider(Expression exp, ListlistSqlParaModel)

{

LambdaExpression le= exp asLambdaExpression;returnExpressionRouter(le.Body, listSqlParaModel);

}private static string MemberExpressionProvider(Expression exp, ListlistSqlParaModel)

{if (!exp.ToString().StartsWith("value"))

{

MemberExpression me= exp asMemberExpression;if (me.Member.Name == "Now")

{

GetSqlParaModel(listSqlParaModel, DateTime.Now);return "@para" +listSqlParaModel.Count;

}returnme.Member.Name;

}else{var result =Expression.Lambda(exp).Compile().DynamicInvoke();if (result == null)

{return "null";

}else if (result isValueType)

{

GetSqlParaModel(listSqlParaModel, GetValueType(result));return "@para" +listSqlParaModel.Count;

}else if (result is string || result is DateTime || result is char)

{

GetSqlParaModel(listSqlParaModel, GetValueType(result));return "@para" +listSqlParaModel.Count;

}else if (result is int[])

{var rl = result as int[];

StringBuilder sbTmp= newStringBuilder();foreach (var r inrl)

{

GetSqlParaModel(listSqlParaModel, r.ToString().ToInt32());

sbTmp.Append("@para" + listSqlParaModel.Count + ",");

}return sbTmp.ToString().Substring(0, sbTmp.ToString().Length - 1);

}else if (result is string[])

{var rl = result as string[];

StringBuilder sbTmp= newStringBuilder();foreach (var r inrl)

{

GetSqlParaModel(listSqlParaModel, r.ToString());

sbTmp.Append("@para" + listSqlParaModel.Count + ",");

}return sbTmp.ToString().Substring(0, sbTmp.ToString().Length - 1);

}

}return "";

}private static string MethodCallExpressionProvider(Expression exp, ListlistSqlParaModel)

{

MethodCallExpression mce= exp asMethodCallExpression;if (mce.Method.Name == "Contains")

{if (mce.Object == null)

{return string.Format("{0} in ({1})", ExpressionRouter(mce.Arguments[1], listSqlParaModel), ExpressionRouter(mce.Arguments[0], listSqlParaModel));

}else{if (mce.Object.NodeType ==ExpressionType.MemberAccess)

{//w => w.name.Contains("1")

var _name =ExpressionRouter(mce.Object, listSqlParaModel);var _value = ExpressionRouter(mce.Arguments[0], listSqlParaModel);var index = _value.RetainNumber().ToInt32() - 1;

listSqlParaModel[index].value= "%{0}%".FormatWith(listSqlParaModel[index].value);return string.Format("{0} like {1}", _name, _value);

}

}

}else if (mce.Method.Name == "OrderBy")

{return string.Format("{0} asc", ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "OrderByDescending")

{return string.Format("{0} desc", ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "ThenBy")

{return string.Format("{0},{1} asc", MethodCallExpressionProvider(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "ThenByDescending")

{return string.Format("{0},{1} desc", MethodCallExpressionProvider(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "Like")

{return string.Format("({0} like {1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel).Replace("'", ""));

}else if (mce.Method.Name == "NotLike")

{return string.Format("({0} not like '%{1}%')", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel).Replace("'", ""));

}else if (mce.Method.Name == "In")

{return string.Format("{0} in ({1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "NotIn")

{return string.Format("{0} not in ({1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}return "";

}private static string NewArrayExpressionProvider(Expression exp, ListlistSqlParaModel)

{

NewArrayExpression ae= exp asNewArrayExpression;

StringBuilder sbTmp= newStringBuilder();foreach (Expression ex inae.Expressions)

{

sbTmp.Append(ExpressionRouter(ex, listSqlParaModel));

sbTmp.Append(",");

}return sbTmp.ToString(0, sbTmp.Length - 1);

}private static string ParameterExpressionProvider(Expression exp, ListlistSqlParaModel)

{

ParameterExpression pe= exp asParameterExpression;returnpe.Type.Name;

}private static string UnaryExpressionProvider(Expression exp, ListlistSqlParaModel)

{

UnaryExpression ue= exp asUnaryExpression;var result =ExpressionRouter(ue.Operand, listSqlParaModel);

ExpressionType type=exp.NodeType;if (type ==ExpressionType.Not)

{if (result.Contains("in"))

{

result= result.Replace("in", "not in");

}if (result.Contains("like"))

{

result= result.Replace("like", "not like");

}

}returnresult;

}///

///路由计算///

///

///

///

private static string ExpressionRouter(Expression exp, ListlistSqlParaModel)

{var nodeType =exp.NodeType;if (exp is BinaryExpression) //表示具有二进制运算符的表达式

{returnBinarExpressionProvider(exp, listSqlParaModel);

}else if (exp is ConstantExpression) //表示具有常数值的表达式

{returnConstantExpressionProvider(exp, listSqlParaModel);

}else if (exp is LambdaExpression) //介绍 lambda 表达式。 它捕获一个类似于 .NET 方法主体的代码块

{returnLambdaExpressionProvider(exp, listSqlParaModel);

}else if (exp is MemberExpression) //表示访问字段或属性

{returnMemberExpressionProvider(exp, listSqlParaModel);

}else if (exp is MethodCallExpression) //表示对静态方法或实例方法的调用

{returnMethodCallExpressionProvider(exp, listSqlParaModel);

}else if (exp is NewArrayExpression) //表示创建一个新数组,并可能初始化该新数组的元素

{returnNewArrayExpressionProvider(exp, listSqlParaModel);

}else if (exp is ParameterExpression) //表示一个命名的参数表达式。

{returnParameterExpressionProvider(exp, listSqlParaModel);

}else if (exp is UnaryExpression) //表示具有一元运算符的表达式

{returnUnaryExpressionProvider(exp, listSqlParaModel);

}return null;

}///

///值类型转换///

///

///

private static object GetValueType(object_value)

{var _type =_value.GetType().Name;switch(_type)

{case "Decimal": return_value.ToDecimal();case "Int32": return_value.ToInt32();case "DateTime": return_value.ToDateTime();case "String": return_value.ToString();case "Char":return_value.ToChar();case "Boolean":return_value.ToBoolean();default: return_value;

}

}///

///sql参数///

///

///

private static void GetSqlParaModel(List listSqlParaModel, objectval)

{

SqlParaModel p= newSqlParaModel();

p.name= "para" + (listSqlParaModel.Count + 1);

p.value=val;

listSqlParaModel.Add(p);

}///

///lambda表达式转换sql///

///

///

///

///

public static string GetWhereSql(Expression> where, List listSqlParaModel) where T : class{string result = string.Empty;if (where != null)

{

Expression exp= where.Body asExpression;

result=ExpressionRouter(exp, listSqlParaModel);

}if (result != string.Empty)

{

result= "where" +result;

}returnresult;

}///

///lambda表达式转换sql///

///

///

///

public static string GetOrderBySql(Expression, IOrderedQueryable>> orderBy) where T : class{string result = string.Empty;if (orderBy != null && orderBy.Body isMethodCallExpression)

{

MethodCallExpression exp= orderBy.Body asMethodCallExpression;

List listSqlParaModel = new List();

result=MethodCallExpressionProvider(exp, listSqlParaModel);

}if (result != string.Empty)

{

result= "order by" +result;

}returnresult;

}///

///lambda表达式转换sql///

///

///

///

public static string GetQueryField(Expression>fields)

{

StringBuilder sbSelectFields= newStringBuilder();if (fields.Body isNewExpression)

{

NewExpression ne= fields.Body asNewExpression;for (var i = 0; i < ne.Members.Count; i++)

{

sbSelectFields.Append(ne.Members[i].Name+ ",");

}

}else if (fields.Body isParameterExpression)

{

sbSelectFields.Append("*");

}else{

sbSelectFields.Append("*");

}if (sbSelectFields.Length > 1)

{

sbSelectFields= sbSelectFields.Remove(sbSelectFields.Length - 1, 1);

}returnsbSelectFields.ToString();

}

}

}-----------------------------------------------------------------------------------------------demo:classProgram

{static void Main(string[] args)

{//Expression> where = w => w.id == "123456";

Expression> where = w => w.id.Contains("1");

List listSqlParaModel = new List();var sql = LambdaToSqlHelper.GetWhereSql(where, listSqlParaModel);

}

}classMyClass

{public stringid;public stringname;public stringdesc;public decimalprice;public intstock;public boolisShow;publicDateTime createTime;

}

lamber表达式sql_lambda表达式转换sql相关推荐

  1. sql表达式_SQL表达式

    sql表达式 SQL expression is a combination of one or more values, operators and SQL functions that resul ...

  2. 前缀表达式中缀表达式后缀表达式之间的转换JAVA代码实现

    一.前缀表达式 (1)中缀表达式转前缀表达式 (2)前缀表达式的计算 二.后缀表达式 (1)中缀表达式转后缀表达式 (2)后缀表达式的计算 三.中缀表达式直接计算 四.总结 代码实现的工具类Expre ...

  3. C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)

    Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string ...

  4. java后缀表达式_表达式计算 java 后缀表达式

    题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...

  5. Lambda表达式和表达式树

    一: Lambda表达式 首先,表达式的类型本身并非委托类型,但它可以通过多种方式隐式或者显式地转换成一个委托实例.匿名函数这个术语同时涵盖了匿名方法和Lambda,很多情况下两者可以使用相互转换原则 ...

  6. PHP怎么输入表达式,PHP: 表达式 - Manual

    章 14. 表达式 表达式是 PHP 最重要的基石.在 PHP 中,几乎你所写的任何东西都是一个表达式.简单但却最精确的定义一个表达式的方式就是"anything that has a va ...

  7. 中缀表达式/后缀表达式/前缀表达式

    1:什么是中缀表达式,前缀表达式,后缀表达式? 正如我们常常潜意识认为我们所说的数字都是十进制,对于数字的其他进制感觉不正确一样,其实只是我们不熟悉而已,其他进制其实也不过就是一种对数据的表达方式而已 ...

  8. 中缀表达式 后缀表达式

    一.什么是中缀表达式 & 后缀表达式? 中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式 举个例子:(1+6/3)*6 - 5 后缀表达式: 更有利于计算机进行计算的一种表达式,不再 ...

  9. python赋值表达式_6. 表达式

    6.表达式¶ 本章将解释 Python 中组成表达式的各种元素的的含义. 语法注释: 在本章和后续章节中,会使用扩展 BNF 标注来描述语法而不是词法分析. 当(某种替代的)语法规则具有如下形式 na ...

最新文章

  1. Android - 下载别人的android demo 运行的时候加载很久问题处理
  2. 最速下降法(梯度下降法)
  3. 使用Flex生成GUID
  4. yii3正式版什么时候发布_事业单位联考结束,成绩什么时候发布?合格分数线怎么算?...
  5. r语言pls分析_零基础学习R语言分析GEO
  6. AcWing提高算法课Level-3 第四章 高级数据结构
  7. SQL:postgresql查询结果加一个自定义的列
  8. 如何设计一个与微信相同的分享sdk
  9. 机制检验——中介检验
  10. 金蝶云星空API调用实践
  11. vtuber面部捕捉工具_Live2D纸片人出道?VTuber工具VUP了解下
  12. echarts pie饼图既显示内部又显示外部指示线
  13. ecshop linux 大小写,ecshop敏感词管理
  14. 获取用户微信头像 高清大图
  15. 我的世界服务器创世神文件夹,我的世界服务器怎么给创世神权限的指令
  16. SpaceX SN8飞船爆炸,马斯克:已拿到全部所需数据,火星,我们来了!
  17. 联合概率和条件概率的区别和联系
  18. UEFI开发与调试---edk2中的Package
  19. MATLAB利用遗传算法求取最优解
  20. PC VR游戏的CPU性能分析与优化

热门文章

  1. boost::safe_numerics::checked_result相关的测试程序
  2. boost::safe_numerics模块实现隐式转换更改数据值的测试程序
  3. boost::gil::threshold_truncate用法的测试程序
  4. boost::core模块实现分配const void指针
  5. boost::callable_traits的is_lvalue_reference_member的测试程序
  6. ITK:创建一个RGB图像
  7. ITK:创建一个向量
  8. VTK:Shaders之MarbleShader
  9. VTK:PolyData之WarpScalar
  10. OpenCV SURF检测的实例(附完整代码)