表达式目录树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);
View Code

通过不同的条件来拼接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的主要内容,如果未能解决你的问题,请参考以下文章

表达式目录树Expression

Expression 表达式目录树

Expression

NetCore调整表达式目录树实现并发布到NuGet

Lambda创建表达式目录树

第十九节: 结合表达式目录树来封装EF的BaseDal层的方法