C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
2019-04-15 18:25 音乐让我说 阅读(444) 评论(0) 编辑 收藏 举报可能你还感兴趣:
1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到
2. C# Lambda 表达式学习之(二):LambdaExpression 实战练习
3. 基于 Entity Framework FluentAPI 思想的强类型的 Lambda Expressions 实体映射
4. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
直接贴代码了:
Post.cs
public class Post { public int Id { get; set; } public string PostTitle { get; set; } public int BlogId { get; set; } }
Program.cs
static void Main(string[] args) { using (var context = new BloggingContext()) { //下面是有数据2 Expression<Func<Post, bool>> conditionExps3 = LambdaExtensionsIn.BuildPropertyInExpression<Post>("BlogId", new List<int?>() { 2, 5, null, 17 }); var query14 = context.Set<Post>().Where(conditionExps3); Console.WriteLine(); } Console.ReadLine(); }
LambdaExtensionsIn.cs
public class LambdaExtensionsIn { /// <summary> /// 构建 属性A等于值1 或者 属性A等于值2 或者 属性A等于值3 等等一个或多个 OrElse 的表达式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="propName"></param> /// <param name="values"></param> /// <returns></returns> public static Expression<Func<T, bool>> BuildPropertyInExpression<T>(string propName, IEnumerable values) { ParameterExpression x = Expression.Parameter(typeof(T), "x"); LambdaExpression expr; var tempExp = BuildPropertyInExpressionCore(x, propName, values); if (tempExp == null) { expr = Expression.Lambda(LambdaExpression.Constant(false), x); } else { expr = Expression.Lambda(tempExp, x); } return (Expression<Func<T, bool>>)expr; } /// <summary> /// 构建属性等于单个值的表达式 /// </summary> /// <param name="x"></param> /// <param name="propName"></param> /// <param name="id"></param> /// <returns></returns> private static BinaryExpression BuildPropertyEqualsSingleValueExpression(ParameterExpression x, string propName, object id) { MemberExpression left = Expression.Property(x, propName); ConstantExpression right = Expression.Constant(id); return Expression.Equal(left, right); } /// <summary> /// 构建 属性A等于值1 或者 属性A等于值2 或者 属性A等于值3 等等一个或多个 OrElse 的表达式的核心 /// </summary> /// <param name="x"></param> /// <param name="propName"></param> /// <param name="values"></param> /// <returns></returns> private static BinaryExpression BuildPropertyInExpressionCore(ParameterExpression x, string propName, IEnumerable values) { if (values == null) { throw new ArgumentNullException("values"); } IEnumerator enumerator = values.GetEnumerator(); int i = 0; BinaryExpression binaryExp = null; while (enumerator.MoveNext()) { object objValue = enumerator.Current; if (objValue == null) { continue; } if (i == 0) { binaryExp = BuildPropertyEqualsSingleValueExpression(x, propName, objValue); i++; continue; } binaryExp = Expression.OrElse(binaryExp, BuildPropertyEqualsSingleValueExpression(x, propName, objValue)); i++; } return binaryExp; } }
运行截图:
01:
02:
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。