C#怎么动态创建lambda表达式

其他教程   发布日期:2023年07月14日   浏览次数:525

这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!

C#动态创建lambda表达式

代码如下:

  1. //querydata 是Dictionary<string,string> 放着要查询的属性名和相应的值
  2. ParameterExpression pe = Expression.Parameter(typeof(Customer), "customer");//lambda表示式里的参数我这边是单参数
  3. Expression left;//相当于 a=b 的 a
  4. Expression right;//相当于a=b 的 b
  5. Expression e;//作为最后形成的表达式的载体
  6. //先放一个初始值后面被替换不然循环里不方便用
  7. left = Expression.Property(pe, typeof(Customer).GetProperty("name"));//Customer.name
  8. right = Expression.Constant("巅峰白杨");//Constant方法设置属性对应的值
  9. e = Expression.Equal(left, right);//Customer.name=="巅峰白杨"
  10. //循环查询条件字典
  11. foreach (var item in querydata)
  12. {
  13. if (!item.Value.ToString().Trim().Equals(""))
  14. {
  15. left = Expression.Property(pe, typeof(SFC_Package).GetProperty(item.Key));
  16. right = Expression.Constant(item.Value);
  17. if (index == 0)
  18. {
  19. e = Expression.Equal(left, right);
  20. index++;
  21. }
  22. else
  23. {
  24. if (e != null)
  25. {
  26. Expression tempe;
  27. tempe = Expression.Equal(left, right);
  28. e = Expression.And(tempe, e);//加了一个&&连接两个判断
  29. }
  30. }
  31. }
  32. }
  33. IQueryable<Customer> queryableData = db.Customer.AsQueryable<Customer>();//将IEnumerable类型转成IQueryable
  34. //Where方法的lambda表达式
  35. MethodCallExpression whereCallExpression = Expression.Call(
  36. typeof(Queryable),
  37. "Where",
  38. new Type[] { queryableData.ElementType },
  39. queryableData.Expression,
  40. Expression.Lambda<Func<SFC_Package, bool>>(e, new ParameterExpression[] { pe }));
  41. //OrderBy方法的lambda表达式 这边写的有点冗余第一次写不太习惯,想想重复了很多
  42. var propertyinfo=typeof(Customer).GetProperty("Name");
  43. Expression body=Expression.Property(pe,propertyinfo);
  44. Type nametype=propertyinfo.PropertyType;
  45. MethodCallExpression orderByCallExpression = Expression.Call(
  46. typeof(Queryable),
  47. "OrderBy",
  48. new Type[] { queryableData.ElementType, nametype},//其实可以写成queryableData.ElementType.GetProperty("Name").PropertyType
  49. whereCallExpression,
  50. Expression.Lambda(body, pe));
  51. //使用已创建好的lambda表达式查询数据 ps:IQueryable和IEnumerable可以转换方便处理查询结果
  52. IQueryable<SFC_Package> results = queryableData.Provider.CreateQuery<Customer>(orderByCallExpression);

网上还看到一种简单的多条件查询的方法,相当于

  1. var data=db.Customer.Where(o=>o.name=="西门吹雪");
  2. data=data.Where(o=>o.sex="男神")

用循环来多次Where实现多条件查询,感觉可能会造成多次数据库查询,不过用在Linq to Object

上应该挺好的。

最后学习的动态创建lambda表达式地址 点击打开链接

Lambda表达式动态拼接生成工具类

  1. public static class LambdaUtil<T>
  2. {
  3. /// <summary>
  4. /// lambda表达式:t=>true
  5. /// </summary>
  6. /// <returns></returns>
  7. public static Expression<Func<T, bool>> True()
  8. {
  9. return t => true;
  10. }
  11. /// <summary>
  12. /// lambda表达式:t=>false
  13. /// </summary>
  14. /// <returns></returns>
  15. public static Expression<Func<T, bool>> False()
  16. {
  17. return t => false;
  18. }
  19. /// <summary>
  20. /// lambda表达式:t=>t.propName
  21. /// 多用于order排序
  22. /// </summary>
  23. /// <typeparam name="T">参数类型</typeparam>
  24. /// <typeparam name="TKey">返回类型</typeparam>
  25. /// <param name="propName">属性名</param>
  26. /// <returns></returns>
  27. private static Expression<Func<T, TKey>> Order<TKey>(string propName)
  28. {
  29. // 创建节点参数t
  30. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  31. // 创建一个属性
  32. MemberExpression property = Expression.Property(parameter, propName);
  33. // 生成lambda表达式
  34. return Expression.Lambda<Func<T, TKey>>(property, parameter);
  35. }
  36. /// <summary>
  37. /// lambda表达式:t=>t.propName==propValue
  38. /// 多用于where条件
  39. /// </summary>
  40. /// <typeparam name="T">参数类型</typeparam>
  41. /// <param name="propName">属性名称</param>
  42. /// <param name="propValue">属性值</param>
  43. /// <returns></returns>
  44. public static Expression<Func<T, bool>> Equal(string propName, object propValue)
  45. {
  46. // 创建节点参数t
  47. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  48. // 创建一个成员(字段/属性)
  49. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  50. // 创建一个常数
  51. ConstantExpression constant = Expression.Constant(propValue);
  52. // 创建一个相等比较Expression
  53. BinaryExpression binary = Expression.Equal(member, constant);
  54. // 生成lambda表达式
  55. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  56. }
  57. /// <summary>
  58. /// lambda表达式:t=>t.propName!=propValue
  59. /// 多用于where条件
  60. /// </summary>
  61. /// <typeparam name="T">参数类型</typeparam>
  62. /// <param name="propName">属性名称</param>
  63. /// <param name="propValue">属性值</param>
  64. /// <returns></returns>
  65. public static Expression<Func<T, bool>> NotEqual(string propName, object propValue)
  66. {
  67. // 创建节点参数t
  68. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  69. // 创建一个成员(字段/属性)
  70. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  71. // 创建一个常数
  72. ConstantExpression constant = Expression.Constant(propValue);
  73. // 创建一个不相等比较Expression
  74. BinaryExpression binary = Expression.NotEqual(member, constant);
  75. // 生成lambda表达式
  76. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  77. }
  78. /// <summary>
  79. /// lambda表达式:t=>t.propName&lt;propValue
  80. /// 多用于where条件
  81. /// </summary>
  82. /// <typeparam name="T">参数类型</typeparam>
  83. /// <param name="propName">属性名称</param>
  84. /// <param name="propValue">属性值</param>
  85. /// <returns></returns>
  86. public static Expression<Func<T, bool>> LessThan(string propName, object propValue)
  87. {
  88. // 创建节点参数t
  89. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  90. // 创建一个成员(字段/属性)
  91. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  92. // 创建一个常数
  93. ConstantExpression constant = Expression.Constant(propValue);
  94. // 创建一个不相等比较Expression
  95. BinaryExpression binary = Expression.LessThan(member, constant);
  96. // 生成lambda表达式
  97. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  98. }
  99. /// <summary>
  100. /// lambda表达式:t=>t.propName&lt;=propValue
  101. /// 多用于where条件
  102. /// </summary>
  103. /// <typeparam name="T">参数类型</typeparam>
  104. /// <param name="propName">属性名称</param>
  105. /// <param name="propValue">属性值</param>
  106. /// <returns></returns>
  107. public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue)
  108. {
  109. // 创建节点参数t
  110. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  111. // 创建一个成员(字段/属性)
  112. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  113. // 创建一个常数
  114. ConstantExpression constant = Expression.Constant(propValue);
  115. // 创建一个不相等比较Expression
  116. BinaryExpression binary = Expression.LessThanOrEqual(member, constant);
  117. // 生成lambda表达式
  118. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  119. }
  120. /// <summary>
  121. /// lambda表达式:t=>t.propName>propValue
  122. /// 多用于where条件
  123. /// </summary>
  124. /// <typeparam name="T">参数类型</typeparam>
  125. /// <param name="propName">属性名称</param>
  126. /// <param name="propValue">属性值</param>
  127. /// <returns></returns>
  128. public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue)
  129. {
  130. // 创建节点参数t
  131. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  132. // 创建一个成员(字段/属性)
  133. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  134. // 创建一个常数
  135. ConstantExpression constant = Expression.Constant(propValue);
  136. // 创建一个不相等比较Expression
  137. BinaryExpression binary = Expression.GreaterThan(member, constant);
  138. // 生成lambda表达式
  139. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  140. }
  141. /// <summary>
  142. /// lambda表达式:t=>t.propName>=propValue
  143. /// 多用于where条件
  144. /// </summary>
  145. /// <typeparam name="T">参数类型</typeparam>
  146. /// <param name="propName">属性名称</param>
  147. /// <param name="propValue">属性值</param>
  148. /// <returns></returns>
  149. public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue)
  150. {
  151. // 创建节点参数t
  152. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  153. // 创建一个成员(字段/属性)
  154. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  155. // 创建一个常数
  156. ConstantExpression constant = Expression.Constant(propValue);
  157. // 创建一个不相等比较Expression
  158. BinaryExpression binary = Expression.GreaterThanOrEqual(member, constant);
  159. // 生成lambda表达式
  160. return Expression.Lambda<Func<T, bool>>(binary, parameter);
  161. }
  162. /// <summary>
  163. /// lambda表达式:t=>{t.contains(propvalue1) ||...||t.contains(propvalueN)}
  164. /// 多用于where条件
  165. /// </summary>
  166. /// <typeparam name="T">参数类型</typeparam>
  167. /// <param name="propName">属性名称</param>
  168. /// <param name="propValues">属性值数组</param>
  169. /// <returns></returns>
  170. public static Expression<Func<T, bool>> In(string propName, string[] propValues)
  171. {
  172. // 创建节点参数t
  173. ParameterExpression parameter = Expression.Parameter(typeof(T), "t"); // left
  174. // 创建一个成员(字段/属性)
  175. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  176. // 创建一个常数
  177. Expression constant = Expression.Constant(false);
  178. // 创建一个方法
  179. MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  180. foreach (string item in propValues)
  181. {
  182. // 创建一个带参数方法Expression
  183. MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right
  184. // 连接参数方法
  185. constant = Expression.Or(methodCall, constant);
  186. }
  187. // 生成lambda表达式
  188. return Expression.Lambda<Func<T, bool>>(constant, new ParameterExpression[] { parameter });
  189. }
  190. /// <summary>
  191. /// lambda表达式:t=>{!(t.contains(propvalue1) ||...||t.contains(propvalueN))}
  192. /// 多用于where条件
  193. /// </summary>
  194. /// <typeparam name="T">参数类型</typeparam>
  195. /// <param name="propName">属性名称</param>
  196. /// <param name="propValues">属性值数组</param>
  197. /// <returns></returns>
  198. public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues)
  199. {
  200. // 创建节点参数t
  201. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  202. // 创建一个成员(字段/属性)
  203. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  204. // 创建一个常数
  205. Expression constant = Expression.Constant(false);
  206. // 创建一个方法
  207. MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  208. foreach (string item in propValues)
  209. {
  210. // 创建一个带参数方法Expression
  211. MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right
  212. // 连接参数方法
  213. constant = Expression.Or(methodCall, constant);
  214. }
  215. // 生成lambda表达式
  216. return Expression.Lambda<Func<T, bool>>(Expression.Not(constant), new ParameterExpression[] { parameter });
  217. }
  218. /// <summary>
  219. /// lambda表达式:t=>t.propName.Contains(propValue)
  220. /// 多用于where条件
  221. /// </summary>
  222. /// <typeparam name="T">参数类型</typeparam>
  223. /// <param name="propName">属性名称</param>
  224. /// <param name="propValue">属性值</param>
  225. /// <returns></returns>
  226. public static Expression<Func<T, bool>> Contains(string propName, string propValue)
  227. {
  228. // 创建节点参数t
  229. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  230. // 创建一个成员(字段/属性)
  231. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  232. // 创建一个常数
  233. ConstantExpression constant = Expression.Constant(propValue, typeof(string));
  234. // 创建一个方法
  235. MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
  236. // 创建一个带参数方法Expression
  237. MethodCallExpression methodCall = Expression.Call(member, method, constant);
  238. // 生成lambda表达式
  239. return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
  240. }
  241. /// <summary>
  242. /// lambda表达式:t=>t.propName.Contains(propValue)
  243. /// 多用于where条件
  244. /// </summary>
  245. /// <typeparam name="T">参数类型</typeparam>
  246. /// <param name="propName">属性名称</param>
  247. /// <param name="propValue">属性值</param>
  248. /// <returns></returns>
  249. public static Expression<Func<T, bool>> StartWith(string propName, string propValue)
  250. {
  251. // 创建节点参数t
  252. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  253. // 创建一个成员(字段/属性)
  254. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  255. // 创建一个常数
  256. ConstantExpression constant = Expression.Constant(propValue, typeof(string));
  257. // 创建一个方法
  258. MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
  259. // 创建一个带参数方法Expression
  260. MethodCallExpression methodCall = Expression.Call(member, method, constant);
  261. // 生成lambda表达式
  262. return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
  263. }
  264. /// <summary>
  265. /// lambda表达式:t=>t.propName.Contains(propValue)
  266. /// 多用于where条件
  267. /// </summary>
  268. /// <typeparam name="T">参数类型</typeparam>
  269. /// <param name="propName">属性名称</param>
  270. /// <param name="propValue">属性值</param>
  271. /// <returns></returns>
  272. public static Expression<Func<T, bool>> EndsWith(string propName, string propValue)
  273. {
  274. // 创建节点参数t
  275. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  276. // 创建一个成员(字段/属性)
  277. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  278. // 创建一个常数
  279. ConstantExpression constant = Expression.Constant(propValue, typeof(string));
  280. // 创建一个方法
  281. MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
  282. // 创建一个带参数方法Expression
  283. MethodCallExpression methodCall = Expression.Call(member, method, constant);
  284. // 生成lambda表达式
  285. return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
  286. }
  287. /// <summary>
  288. /// lambda表达式:!(t=>t.propName.Contains(propValue))
  289. /// 多用于where条件
  290. /// </summary>
  291. /// <typeparam name="T">参数类型</typeparam>
  292. /// <param name="propName">属性名称</param>
  293. /// <param name="propValue">属性值</param>
  294. /// <returns></returns>
  295. public static Expression<Func<T, bool>> NotContains(string propName, string propValue)
  296. {
  297. // 创建节点参数t
  298. ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
  299. // 创建一个成员(字段/属性)
  300. MemberExpression member = Expression.PropertyOrField(parameter, propName);
  301. // 创建一个常数
  302. ConstantExpression constant = Expression.Constant(propValue, typeof(string));
  303. &n

以上就是C#怎么动态创建lambda表达式的详细内容,更多关于C#怎么动态创建lambda表达式的资料请关注九品源码其它相关文章!