where条件的lambda转化为sql语句
网上找的源码,但是博主说有bug 让自己调试。这个是我经过多次修改后的代码,可以直接用
- public static class LambdaToSqlHelper
- {
- #region 基础方法
- #region 获取条件语句方法
- private static string GetWhereSql<T>(Expression<Func<T, bool>> func, List<ParMODEL> parModelList) where T : class
- {
- string res = "";
- if (func.Body is BinaryExpression)
- {
- //起始参数
- BinaryExpression be = ((BinaryExpression)func.Body);
- res = BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
- }
- else if (func.Body is MethodCallExpression)
- {
- MethodCallExpression be = ((MethodCallExpression)func.Body);
- res = ExpressionRouter(func.Body, parModelList);
- }
- else
- {
- res = " ";
- }
- return res;
- }
- #endregion 获取条件语句方法
- #region 获取排序语句 order by
- private static string GetOrderSql<T>(Expression<Func<T, object>> exp) where T : class
- {
- var res = "";
- if (exp.Body is UnaryExpression)
- {
- UnaryExpression ue = ((UnaryExpression)exp.Body);
- List<ParMODEL> parModelList = new List<ParMODEL>();
- res = "order by `" + ExpressionRouter(ue.Operand, parModelList).ToLower() + "`";
- }
- else
- {
- MemberExpression order = ((MemberExpression)exp.Body);
- res = "order by `" + order.Member.Name.ToLower() + "`";
- }
- return res;
- }
- #endregion 获取排序语句 order by
- #endregion 基础方法
- #region 底层
- public static bool In<T>(this T obj, T[] array)
- {
- return true;
- }
- public static bool NotIn<T>(this T obj, T[] array)
- {
- return true;
- }
- public static bool Like(this string str, string likeStr)
- {
- return true;
- }
- public static bool NotLike(this string str, string likeStr)
- {
- return true;
- }
- private static string GetValueStringByType(object oj)
- {
- if (oj == null)
- {
- return "null";
- }
- else if (oj is ValueType)
- {
- return oj.ToString();
- }
- else if (oj is string || oj is DateTime || oj is char)
- {
- return string.Format("'{0}'", oj.ToString());
- }
- else
- {
- return string.Format("'{0}'", oj.ToString());
- }
- }
- private static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type, List<ParMODEL> parModelList)
- {
- string sb = "(";
- //先处理左边
- string reLeftStr = ExpressionRouter(left, parModelList);
- sb += reLeftStr;
- sb += ExpressionTypeCast(type);
- //再处理右边
- string tmpStr = ExpressionRouter(right, parModelList);
- 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 += ")";
- }
- private static string ExpressionRouter(Expression exp, List<ParMODEL> parModelList)
- {
- string sb = string.Empty;
- if (exp is BinaryExpression)
- {
- BinaryExpression be = ((BinaryExpression)exp);
- return BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
- }
- else if (exp is MemberExpression)
- {
- MemberExpression me = ((MemberExpression)exp);
- if (!exp.ToString().StartsWith("value"))
- {
- return me.Member.Name;
- }
- else
- {
- var result = Expression.Lambda(exp).Compile().DynamicInvoke();
- if (result == null)
- {
- return "null";
- }
- else if (result is ValueType)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = result.ToString().ToIntByStr();
- parModelList.Add(p);
- //return ce.Value.ToString();
- return "@par" + parModelList.Count;
- }
- else if (result is string || result is DateTime || result is char)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = result.ToString();
- parModelList.Add(p);
- //return string.Format("'{0}'", ce.Value.ToString());
- return "@par" + parModelList.Count;
- }
- else if (result is int[])
- {
- var rl = result as int[];
- StringBuilder sbIntStr = new StringBuilder();
- foreach (var r in rl)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = r.ToString().ToIntByStr();
- parModelList.Add(p);
- //return string.Format("'{0}'", ce.Value.ToString());
- sbIntStr.Append("@par" + parModelList.Count + ",");
- }
- return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
- }
- else if (result is string[])
- {
- var rl = result as string[];
- StringBuilder sbIntStr = new StringBuilder();
- foreach (var r in rl)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = r.ToString();
- parModelList.Add(p);
- //return string.Format("'{0}'", ce.Value.ToString());
- sbIntStr.Append("@par" + parModelList.Count + ",");
- }
- return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
- }
- }
- }
- else if (exp is NewArrayExpression)
- {
- NewArrayExpression ae = ((NewArrayExpression)exp);
- StringBuilder tmpstr = new StringBuilder();
- foreach (Expression ex in ae.Expressions)
- {
- tmpstr.Append(ExpressionRouter(ex, parModelList));
- tmpstr.Append(",");
- }
- //添加参数
- return tmpstr.ToString(0, tmpstr.Length - 1);
- }
- else if (exp is MethodCallExpression)
- {
- MethodCallExpression mce = (MethodCallExpression)exp;
- string par = ExpressionRouter(mce.Arguments[0], parModelList);
- if (mce.Method.Name == "Like")
- {
- //添加参数用
- return string.Format("({0} like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
- }
- else if (mce.Method.Name == "NotLike")
- {
- //添加参数用
- return string.Format("({0} Not like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
- }
- else if (mce.Method.Name == "In")
- {
- //添加参数用
- return string.Format("{0} In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
- }
- else if (mce.Method.Name == "NotIn")
- {
- //添加参数用
- return string.Format("{0} Not In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
- }
- }
- else if (exp is ConstantExpression)
- {
- ConstantExpression ce = ((ConstantExpression)exp);
- if (ce.Value == null)
- {
- return "null";
- }
- else if (ce.Value is ValueType)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = ce.Value.ToString().ToIntByStr();
- parModelList.Add(p);
- //return ce.Value.ToString();
- return "@par" + parModelList.Count;
- }
- else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
- {
- ParMODEL p = new ParMODEL();
- p.name = "par" + (parModelList.Count + 1);
- p.value = ce.Value.ToString();
- parModelList.Add(p);
- //return string.Format("'{0}'", ce.Value.ToString());
- return "@par" + parModelList.Count;
- }
- //对数值进行参数附加
- }
- else if (exp is UnaryExpression)
- {
- UnaryExpression ue = ((UnaryExpression)exp);
- return ExpressionRouter(ue.Operand, parModelList);
- }
- return null;
- }
- private static string ExpressionTypeCast(ExpressionType type)
- {
- switch (type)
- {
- case ExpressionType.And:
- 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:
- 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;
- }
- }
- #endregion 底层
- }
- public class SqlParMODEL
- {
- public string sql { set; get; }
- private List<ParMODEL> parList { set; get; }
- }
- public class ParMODEL
- {
- public string name { set; get; }
- public object value { set; get; }
- }
where条件的lambda转化为sql语句的更多相关文章
- Lambda表达式转SQL语句类库
/* 作者:道法自然 * 个人邮件:myyangbin@sina.cn * 2014-10-1 */ Lambda表达式转SQL语句类库源码下载:http://download.csdn.net/ ...
- C# Expression 树转化为SQL语句(一)
sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...
- Hql语句转化为sql语句中文乱码问题
刚刚学习Hql语句就出现这一的问题,百度半天终于解决了,总结一下解决的方案: 出现中文乱码最可能的原因是hibernate配置文件配置的问题 1.检查url路径是否指定字符集为UTF-8 <pr ...
- C#实现把String字符串转化为SQL语句中的In后接的参数
实现把String字符串转化为In后可用参数代码: public string StringToList(string aa) { string bb1 = "("; if (!s ...
- 根据多表条件更新表.............. 一条sql语句.............
CREATE TABLE a( NAME INT, age int ); CREATE TABLE b( height INT, weight int ); ,); ,); SELECT * FROM ...
- MyBatis中动态SQL语句完成多条件查询
一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...
- 理想中的SQL语句条件拼接方式 (二)
问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 . 效果 现在有2个类映射数据库的2张表,结构如下: public class User { public int U ...
- Python使用sql语句对mysql数据库多条件模糊查询
1 def find_worldByName(c_name,continent): 2 print(c_name) 3 print(continent) 4 sql = " SELECT * ...
- 数据库-转换sql语句
文章描述:主要说明转换成SQL语句的过程.----必要信息(数据库名,表名,条件)转换成SQL语句 一些界面上数据增删改查的操作往往只需要输入一数据库名,表名,加条件就可以进行数据查询了,在这背后是怎 ...
随机推荐
- ubuntu下安装teamviewer
Ubuntu 14.04 安装teamviewer出现安装32位依赖包 wget http://download.teamviewer.com/download/teamviewer_i386.deb ...
- php 编程效率(2)
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...
- ensp实战之防火墙安全转发策略
本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...
- HDU 5861 Road
首先要计算出每一条路最早开始的那一天,然后最晚结束的那一天. 这些天之间这条边都必须$open$,然后就变成一个线段树区间$+val$的问题了,最后询问一个每个点的$val$是多少. 注意:数据中有$ ...
- screen实现关闭ssh之后继续运行代码
本文基于Ubuntu 14.04 使用SSH连接远程服务器,启动服务,退出SSH后,服务也就终止了,使用Screen可以解决这个问题. 1.安装Screen apt-get install scree ...
- iOS开发加快审核app
实现app加快审核的步骤: 1.https://developer.apple.com/contact/进入这个网址点击App Store下的Expediting an App Review进入这个页 ...
- List分页 参考
public <T> List<List<T>> splitList(List<T> list, int pageSize) { int listSiz ...
- C语言实现用户输入
用户输入一个字符串然后回车表示结束.因为用户在输入的过程中长度是不确定的,所以要求自己使用的循环写的更好.在这里自己写了一个代码,效率不高,相对来说如果能模拟出C++中的vector向量可能会好一些. ...
- 索引图像(X与map)的显示、保存、转化
有的图像载入后,出现X.map两个矩阵,那么他就是索引图像. load wbarb; figure,imshow(X,map);%显示原图 imwrite(X,map,'C:\Users\Jv\Des ...
- Linux中kettle自动化部署脚本
自己写的一个自动化在Linux中部署kettle的脚本,包括一些遇到的问题在脚本中都有涉及. kettle是官网最新版本pdi-ce-6.1.0.1-196.zip 目前最新版本下载地址:https: ...