表达式目录树Expression
Posted yzm97
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式目录树Expression相关的知识,希望对你有一定的参考价值。
表达式目录树是用于动态的linq语句的拼装在以前遇到数据筛选的情况下我们日常的操作是
1 Console.WriteLine("输入Name 不写为空"); 2 var name = Console.ReadLine(); 3 Console.WriteLine("输入PassWord 不写为空"); 4 var PassWord = Console.ReadLine(); 5 string sql = "select * from Student where 1=1"; 6 if (!string.IsNullOrWhiteSpace(name)) 7 { 8 sql += $" Name like %{name}% "; 9 } 10 if (!string.IsNullOrWhiteSpace(PassWord)) 11 { 12 sql += $" PassWord like %{PassWord}% "; 13 } 14 15 Console.WriteLine(sql);
通过不同的条件来拼接sql语句从而使改变sql语句从而查询的结果
现在我们可以通过表达式目录树来修改linq语句从而达到动态修改linq语句
我们先从简单版的开始 不同的委托通过表达目录树来修改
1 { 2 Func<int, int, int> func = (m, n) => m * n + 2; //匿名方法 3 Expression<Func<int, int, int>> exp = (m, n) => m * n + 2; 4 //声明一个表达式目录树 5 //快捷方式的声明 数据结构; 6 //类似于一个树形结构,描述不同变量和常量之间的关系 数据结构; 7 //表达式目录树:语法树,或者说是一种数据结构 8 int iResult1 = func.Invoke(12, 23); 9 //exp.Compile()=> 委托; 10 int iResult2 = exp.Compile().Invoke(12, 23); //12 * 23 +2 278 11 12 //int iResult = func.Invoke(12, 13); 13 //Expression<Func<int, int, int>> exp1 = (m, n) => 14 // { 15 // return m * n + 2; 16 // }; 不能有语句体,不能当做一个方法,不能有大括号,只能有一行代码 17 } 18 19 { 20 //手动拼装表达式目录树,不是用的lambda的快捷方式 21 { 22 //Expression<Func<int>> expression = () => 123 + 234; 23 ConstantExpression left = Expression.Constant(123, typeof(int)); 24 ConstantExpression right = Expression.Constant(234, typeof(int)); 25 var plus = Expression.Add(left, right); 26 Expression<Func<int>> expression = Expression.Lambda<Func<int>>(plus, new ParameterExpression[0]); 27 int iResult = expression.Compile().Invoke(); 28 int iResult1 = expression.Compile()(); 29 } 30 { 31 // 更复杂一点的: 32 //Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 2; 33 ParameterExpression m = Expression.Parameter(typeof(int), "m"); 34 ParameterExpression n = Expression.Parameter(typeof(int), "n"); 35 ConstantExpression constant2 = Expression.Constant(2, typeof(int)); 36 var multiply = Expression.Multiply(m, n); 37 var plus1 = Expression.Add(multiply, m); 38 var plus2 = Expression.Add(plus1, n); 39 var plus = Expression.Add(plus2, constant2); 40 Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus, new ParameterExpression[] 41 { 42 m, 43 n 44 }); 45 int iResult = expression.Compile().Invoke(12, 10); 46 47 }
那么这么复杂的Expression这么简单的获取呢
这里我们需要准备两个东西,一个是反编译工具(我用的是ILSpy比较简单结尾有网盘地址)还有就是你的语句了
以学生为例查找学的用户为张三的学生和密码为1234的用
1 private void GetExprssion() 2 { 3 4 Expression<Func<Student, bool>> exp = (x) => x.Name.Equals("张三") && x.PassWord.Equals("1234"); 5 }
这就是通过反编译工具翻译出来的Expression语句
1 private void GetExprssion() 2 { 3 ParameterExpression parameterExpression = Expression.Parameter(typeof(Student), "x"); 4 Expression<Func<Student, bool>> expression = Expression.Lambda<Func<Student, bool>>(Expression.AndAlso(Expression.Call(Expression.Property(parameterExpression, (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(get_Name()))), (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(Equals())), new Expression[] 5 { 6 Expression.Constant("张三", typeof(string)) 7 }), Expression.Call(Expression.Property(parameterExpression, (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(get_PassWord()))), (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(Equals())), new Expression[] 8 { 9 Expression.Constant("1234", typeof(string)) 10 })), new ParameterExpression[] 11 { 12 parameterExpression 13 }); 14 }
https://pan.baidu.com/s/1meI-YyapEgjiDIpXyTIJiw
提取码:je6j
复制这段内容后打开百度网盘手机App,操作更方便哦
以上是关于表达式目录树Expression的主要内容,如果未能解决你的问题,请参考以下文章