[总结]动态Lambda表达式构建
直接上代码:
var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //var r = ints.Where(i => i > 5); // 要实现的表达式 // 创建参数 i var parameter = Expression.Parameter(typeof(int), "i"); // 创建常量5 var constant = Expression.Constant(5); // 创建比较表达式 i > 5 var bin = Expression.Equal(parameter, constant); bin = Expression.Or(bin, Expression.Equal(parameter, Expression.Constant(3))); // 获取Lambda表达式 var lambda = Expression.Lambda<Func<int, bool>>(bin, parameter); // 通过 Compile 方法获取 Delegate var _r = ints.Where(lambda.Compile()); foreach (var v in _r) Response.Write(v+"<br>");
自定义实体的动态Lambda表达式构建:
public class Student { public int ID { get; set; } public string Name { get; set; } } //构建测试数据 List<Student> students = new List<Student>(); students.Add(new Student() { ID=1, Name="张三"}); students.Add(new Student() { ID = 2, Name = "李四" }); students.Add(new Student() { ID = 3, Name = "王二" }); students.Add(new Student() { ID = 4, Name = "李小兰" }); students.Add(new Student() { ID = 5, Name = "黄五" }); //构建参数表达式 var parameter =Expression.Parameter(typeof(Student), "student"); //构建实体属性表达式 MemberExpression memberExpression = Expression.Property(parameter, "ID"); //构建常量表达式 var constant = Expression.Constant(1); //表达式组合 效果等于 student=>student.ID==1 var bin = Expression.Equal(memberExpression, constant); //表达式组合 效果等于 student=>student.ID==1&&student.ID==2 bin = Expression.Or(bin, Expression.Equal(memberExpression, Expression.Constant(2))); // 获取Lambda表达式 var lambda = Expression.Lambda<Func<Student, bool>>(bin, parameter); var _r = students.Where<Student>(lambda.Compile()); foreach (Student s in _r) { Response.Write(s.Name + "<br>"); }
显示结果:
张三
李四