lamber表达式sql_lambda表达式转换sql
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相关推荐
- sql表达式_SQL表达式
sql表达式 SQL expression is a combination of one or more values, operators and SQL functions that resul ...
- 前缀表达式中缀表达式后缀表达式之间的转换JAVA代码实现
一.前缀表达式 (1)中缀表达式转前缀表达式 (2)前缀表达式的计算 二.后缀表达式 (1)中缀表达式转后缀表达式 (2)后缀表达式的计算 三.中缀表达式直接计算 四.总结 代码实现的工具类Expre ...
- C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)
Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string ...
- java后缀表达式_表达式计算 java 后缀表达式
题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...
- Lambda表达式和表达式树
一: Lambda表达式 首先,表达式的类型本身并非委托类型,但它可以通过多种方式隐式或者显式地转换成一个委托实例.匿名函数这个术语同时涵盖了匿名方法和Lambda,很多情况下两者可以使用相互转换原则 ...
- PHP怎么输入表达式,PHP: 表达式 - Manual
章 14. 表达式 表达式是 PHP 最重要的基石.在 PHP 中,几乎你所写的任何东西都是一个表达式.简单但却最精确的定义一个表达式的方式就是"anything that has a va ...
- 中缀表达式/后缀表达式/前缀表达式
1:什么是中缀表达式,前缀表达式,后缀表达式? 正如我们常常潜意识认为我们所说的数字都是十进制,对于数字的其他进制感觉不正确一样,其实只是我们不熟悉而已,其他进制其实也不过就是一种对数据的表达方式而已 ...
- 中缀表达式 后缀表达式
一.什么是中缀表达式 & 后缀表达式? 中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式 举个例子:(1+6/3)*6 - 5 后缀表达式: 更有利于计算机进行计算的一种表达式,不再 ...
- python赋值表达式_6. 表达式
6.表达式¶ 本章将解释 Python 中组成表达式的各种元素的的含义. 语法注释: 在本章和后续章节中,会使用扩展 BNF 标注来描述语法而不是词法分析. 当(某种替代的)语法规则具有如下形式 na ...
最新文章
- Android - 下载别人的android demo 运行的时候加载很久问题处理
- 最速下降法(梯度下降法)
- 使用Flex生成GUID
- yii3正式版什么时候发布_事业单位联考结束,成绩什么时候发布?合格分数线怎么算?...
- r语言pls分析_零基础学习R语言分析GEO
- AcWing提高算法课Level-3 第四章 高级数据结构
- SQL:postgresql查询结果加一个自定义的列
- 如何设计一个与微信相同的分享sdk
- 机制检验——中介检验
- 金蝶云星空API调用实践
- vtuber面部捕捉工具_Live2D纸片人出道?VTuber工具VUP了解下
- echarts pie饼图既显示内部又显示外部指示线
- ecshop linux 大小写,ecshop敏感词管理
- 获取用户微信头像 高清大图
- 我的世界服务器创世神文件夹,我的世界服务器怎么给创世神权限的指令
- SpaceX SN8飞船爆炸,马斯克:已拿到全部所需数据,火星,我们来了!
- 联合概率和条件概率的区别和联系
- UEFI开发与调试---edk2中的Package
- MATLAB利用遗传算法求取最优解
- PC VR游戏的CPU性能分析与优化
热门文章
- boost::safe_numerics::checked_result相关的测试程序
- boost::safe_numerics模块实现隐式转换更改数据值的测试程序
- boost::gil::threshold_truncate用法的测试程序
- boost::core模块实现分配const void指针
- boost::callable_traits的is_lvalue_reference_member的测试程序
- ITK:创建一个RGB图像
- ITK:创建一个向量
- VTK:Shaders之MarbleShader
- VTK:PolyData之WarpScalar
- OpenCV SURF检测的实例(附完整代码)