网上找的源码,但是博主说有bug 让自己调试。这个是我经过多次修改后的代码,可以直接用

  1. public static class LambdaToSqlHelper
  2. {
  3.  
  4. #region 基础方法
  5.  
  6. #region 获取条件语句方法
  7.  
  8. private static string GetWhereSql<T>(Expression<Func<T, bool>> func, List<ParMODEL> parModelList) where T : class
  9. {
  10. string res = "";
  11. if (func.Body is BinaryExpression)
  12. {
  13. //起始参数
  14.  
  15. BinaryExpression be = ((BinaryExpression)func.Body);
  16. res = BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
  17. }
  18. else if (func.Body is MethodCallExpression)
  19. {
  20. MethodCallExpression be = ((MethodCallExpression)func.Body);
  21. res = ExpressionRouter(func.Body, parModelList);
  22. }
  23. else
  24. {
  25. res = " ";
  26. }
  27.  
  28. return res;
  29. }
  30.  
  31. #endregion 获取条件语句方法
  32.  
  33. #region 获取排序语句 order by
  34.  
  35. private static string GetOrderSql<T>(Expression<Func<T, object>> exp) where T : class
  36. {
  37. var res = "";
  38. if (exp.Body is UnaryExpression)
  39. {
  40. UnaryExpression ue = ((UnaryExpression)exp.Body);
  41. List<ParMODEL> parModelList = new List<ParMODEL>();
  42. res = "order by `" + ExpressionRouter(ue.Operand, parModelList).ToLower() + "`";
  43. }
  44. else
  45. {
  46. MemberExpression order = ((MemberExpression)exp.Body);
  47. res = "order by `" + order.Member.Name.ToLower() + "`";
  48. }
  49. return res;
  50. }
  51.  
  52. #endregion 获取排序语句 order by
  53.  
  54. #endregion 基础方法
  55.  
  56. #region 底层
  57.  
  58. public static bool In<T>(this T obj, T[] array)
  59. {
  60. return true;
  61. }
  62.  
  63. public static bool NotIn<T>(this T obj, T[] array)
  64. {
  65. return true;
  66. }
  67.  
  68. public static bool Like(this string str, string likeStr)
  69. {
  70. return true;
  71. }
  72.  
  73. public static bool NotLike(this string str, string likeStr)
  74. {
  75. return true;
  76. }
  77.  
  78. private static string GetValueStringByType(object oj)
  79. {
  80. if (oj == null)
  81. {
  82. return "null";
  83. }
  84. else if (oj is ValueType)
  85. {
  86. return oj.ToString();
  87. }
  88. else if (oj is string || oj is DateTime || oj is char)
  89. {
  90. return string.Format("'{0}'", oj.ToString());
  91. }
  92. else
  93. {
  94. return string.Format("'{0}'", oj.ToString());
  95. }
  96. }
  97.  
  98. private static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type, List<ParMODEL> parModelList)
  99. {
  100. string sb = "(";
  101. //先处理左边
  102. string reLeftStr = ExpressionRouter(left, parModelList);
  103. sb += reLeftStr;
  104.  
  105. sb += ExpressionTypeCast(type);
  106.  
  107. //再处理右边
  108. string tmpStr = ExpressionRouter(right, parModelList);
  109. if (tmpStr == "null")
  110. {
  111. if (sb.EndsWith(" ="))
  112. {
  113. sb = sb.Substring(0, sb.Length - 2) + " is null";
  114. }
  115. else if (sb.EndsWith("<>"))
  116. {
  117. sb = sb.Substring(0, sb.Length - 2) + " is not null";
  118. }
  119. }
  120. else
  121. {
  122. //添加参数
  123. sb += tmpStr;
  124. }
  125.  
  126. return sb += ")";
  127. }
  128.  
  129. private static string ExpressionRouter(Expression exp, List<ParMODEL> parModelList)
  130. {
  131. string sb = string.Empty;
  132.  
  133. if (exp is BinaryExpression)
  134. {
  135. BinaryExpression be = ((BinaryExpression)exp);
  136. return BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
  137. }
  138. else if (exp is MemberExpression)
  139. {
  140. MemberExpression me = ((MemberExpression)exp);
  141. if (!exp.ToString().StartsWith("value"))
  142. {
  143. return me.Member.Name;
  144. }
  145. else
  146. {
  147. var result = Expression.Lambda(exp).Compile().DynamicInvoke();
  148. if (result == null)
  149. {
  150. return "null";
  151. }
  152. else if (result is ValueType)
  153. {
  154. ParMODEL p = new ParMODEL();
  155. p.name = "par" + (parModelList.Count + 1);
  156. p.value = result.ToString().ToIntByStr();
  157. parModelList.Add(p);
  158. //return ce.Value.ToString();
  159. return "@par" + parModelList.Count;
  160. }
  161. else if (result is string || result is DateTime || result is char)
  162. {
  163. ParMODEL p = new ParMODEL();
  164. p.name = "par" + (parModelList.Count + 1);
  165. p.value = result.ToString();
  166. parModelList.Add(p);
  167. //return string.Format("'{0}'", ce.Value.ToString());
  168. return "@par" + parModelList.Count;
  169. }
  170. else if (result is int[])
  171. {
  172. var rl = result as int[];
  173. StringBuilder sbIntStr = new StringBuilder();
  174. foreach (var r in rl)
  175. {
  176. ParMODEL p = new ParMODEL();
  177. p.name = "par" + (parModelList.Count + 1);
  178. p.value = r.ToString().ToIntByStr();
  179. parModelList.Add(p);
  180. //return string.Format("'{0}'", ce.Value.ToString());
  181. sbIntStr.Append("@par" + parModelList.Count + ",");
  182. }
  183. return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
  184. }
  185. else if (result is string[])
  186. {
  187. var rl = result as string[];
  188. StringBuilder sbIntStr = new StringBuilder();
  189. foreach (var r in rl)
  190. {
  191. ParMODEL p = new ParMODEL();
  192. p.name = "par" + (parModelList.Count + 1);
  193. p.value = r.ToString();
  194. parModelList.Add(p);
  195. //return string.Format("'{0}'", ce.Value.ToString());
  196. sbIntStr.Append("@par" + parModelList.Count + ",");
  197. }
  198. return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
  199. }
  200. }
  201. }
  202. else if (exp is NewArrayExpression)
  203. {
  204. NewArrayExpression ae = ((NewArrayExpression)exp);
  205. StringBuilder tmpstr = new StringBuilder();
  206. foreach (Expression ex in ae.Expressions)
  207. {
  208. tmpstr.Append(ExpressionRouter(ex, parModelList));
  209. tmpstr.Append(",");
  210. }
  211. //添加参数
  212.  
  213. return tmpstr.ToString(0, tmpstr.Length - 1);
  214. }
  215. else if (exp is MethodCallExpression)
  216. {
  217. MethodCallExpression mce = (MethodCallExpression)exp;
  218. string par = ExpressionRouter(mce.Arguments[0], parModelList);
  219. if (mce.Method.Name == "Like")
  220. {
  221. //添加参数用
  222. return string.Format("({0} like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
  223. }
  224. else if (mce.Method.Name == "NotLike")
  225. {
  226. //添加参数用
  227. return string.Format("({0} Not like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
  228. }
  229. else if (mce.Method.Name == "In")
  230. {
  231. //添加参数用
  232. return string.Format("{0} In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
  233. }
  234. else if (mce.Method.Name == "NotIn")
  235. {
  236. //添加参数用
  237. return string.Format("{0} Not In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
  238. }
  239. }
  240. else if (exp is ConstantExpression)
  241. {
  242. ConstantExpression ce = ((ConstantExpression)exp);
  243. if (ce.Value == null)
  244. {
  245. return "null";
  246. }
  247. else if (ce.Value is ValueType)
  248. {
  249. ParMODEL p = new ParMODEL();
  250. p.name = "par" + (parModelList.Count + 1);
  251. p.value = ce.Value.ToString().ToIntByStr();
  252. parModelList.Add(p);
  253. //return ce.Value.ToString();
  254. return "@par" + parModelList.Count;
  255. }
  256. else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
  257. {
  258. ParMODEL p = new ParMODEL();
  259. p.name = "par" + (parModelList.Count + 1);
  260. p.value = ce.Value.ToString();
  261. parModelList.Add(p);
  262. //return string.Format("'{0}'", ce.Value.ToString());
  263. return "@par" + parModelList.Count;
  264. }
  265.  
  266. //对数值进行参数附加
  267. }
  268. else if (exp is UnaryExpression)
  269. {
  270. UnaryExpression ue = ((UnaryExpression)exp);
  271.  
  272. return ExpressionRouter(ue.Operand, parModelList);
  273. }
  274. return null;
  275. }
  276.  
  277. private static string ExpressionTypeCast(ExpressionType type)
  278. {
  279. switch (type)
  280. {
  281. case ExpressionType.And:
  282. case ExpressionType.AndAlso:
  283. return " AND ";
  284.  
  285. case ExpressionType.Equal:
  286. return " =";
  287.  
  288. case ExpressionType.GreaterThan:
  289. return " >";
  290.  
  291. case ExpressionType.GreaterThanOrEqual:
  292. return ">=";
  293.  
  294. case ExpressionType.LessThan:
  295. return "<";
  296.  
  297. case ExpressionType.LessThanOrEqual:
  298. return "<=";
  299.  
  300. case ExpressionType.NotEqual:
  301. return "<>";
  302.  
  303. case ExpressionType.Or:
  304. case ExpressionType.OrElse:
  305. return " Or ";
  306.  
  307. case ExpressionType.Add:
  308. case ExpressionType.AddChecked:
  309. return "+";
  310.  
  311. case ExpressionType.Subtract:
  312. case ExpressionType.SubtractChecked:
  313. return "-";
  314.  
  315. case ExpressionType.Divide:
  316. return "/";
  317.  
  318. case ExpressionType.Multiply:
  319. case ExpressionType.MultiplyChecked:
  320. return "*";
  321.  
  322. default:
  323. return null;
  324. }
  325. }
  326.  
  327. #endregion 底层
  328. }
  329.  
  330. public class SqlParMODEL
  331. {
  332. public string sql { set; get; }
  333.  
  334. private List<ParMODEL> parList { set; get; }
  335. }
  336.  
  337. public class ParMODEL
  338. {
  339. public string name { set; get; }
  340.  
  341. public object value { set; get; }
  342. }

where条件的lambda转化为sql语句的更多相关文章

  1. Lambda表达式转SQL语句类库

    /* 作者:道法自然   * 个人邮件:myyangbin@sina.cn * 2014-10-1 */ Lambda表达式转SQL语句类库源码下载:http://download.csdn.net/ ...

  2. C# Expression 树转化为SQL语句(一)

    sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...

  3. Hql语句转化为sql语句中文乱码问题

    刚刚学习Hql语句就出现这一的问题,百度半天终于解决了,总结一下解决的方案: 出现中文乱码最可能的原因是hibernate配置文件配置的问题 1.检查url路径是否指定字符集为UTF-8 <pr ...

  4. C#实现把String字符串转化为SQL语句中的In后接的参数

    实现把String字符串转化为In后可用参数代码: public string StringToList(string aa) { string bb1 = "("; if (!s ...

  5. 根据多表条件更新表.............. 一条sql语句.............

    CREATE TABLE a( NAME INT, age int ); CREATE TABLE b( height INT, weight int ); ,); ,); SELECT * FROM ...

  6. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  7. 理想中的SQL语句条件拼接方式 (二)

    问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 . 效果 现在有2个类映射数据库的2张表,结构如下: public class User { public int U ...

  8. Python使用sql语句对mysql数据库多条件模糊查询

    1 def find_worldByName(c_name,continent): 2 print(c_name) 3 print(continent) 4 sql = " SELECT * ...

  9. 数据库-转换sql语句

    文章描述:主要说明转换成SQL语句的过程.----必要信息(数据库名,表名,条件)转换成SQL语句 一些界面上数据增删改查的操作往往只需要输入一数据库名,表名,加条件就可以进行数据查询了,在这背后是怎 ...

随机推荐

  1. ubuntu下安装teamviewer

    Ubuntu 14.04 安装teamviewer出现安装32位依赖包 wget http://download.teamviewer.com/download/teamviewer_i386.deb ...

  2. php 编程效率(2)

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

  3. ensp实战之防火墙安全转发策略

    本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...

  4. HDU 5861 Road

    首先要计算出每一条路最早开始的那一天,然后最晚结束的那一天. 这些天之间这条边都必须$open$,然后就变成一个线段树区间$+val$的问题了,最后询问一个每个点的$val$是多少. 注意:数据中有$ ...

  5. screen实现关闭ssh之后继续运行代码

    本文基于Ubuntu 14.04 使用SSH连接远程服务器,启动服务,退出SSH后,服务也就终止了,使用Screen可以解决这个问题. 1.安装Screen apt-get install scree ...

  6. iOS开发加快审核app

    实现app加快审核的步骤: 1.https://developer.apple.com/contact/进入这个网址点击App Store下的Expediting an App Review进入这个页 ...

  7. List分页 参考

    public <T> List<List<T>> splitList(List<T> list, int pageSize) { int listSiz ...

  8. C语言实现用户输入

    用户输入一个字符串然后回车表示结束.因为用户在输入的过程中长度是不确定的,所以要求自己使用的循环写的更好.在这里自己写了一个代码,效率不高,相对来说如果能模拟出C++中的vector向量可能会好一些. ...

  9. 索引图像(X与map)的显示、保存、转化

    有的图像载入后,出现X.map两个矩阵,那么他就是索引图像. load wbarb; figure,imshow(X,map);%显示原图 imwrite(X,map,'C:\Users\Jv\Des ...

  10. Linux中kettle自动化部署脚本

    自己写的一个自动化在Linux中部署kettle的脚本,包括一些遇到的问题在脚本中都有涉及. kettle是官网最新版本pdi-ce-6.1.0.1-196.zip 目前最新版本下载地址:https: ...