【C# Expression】

在这里插入图片描述

初认Expression

			//1-基于:Linq to object 可以对内存数据查询动态地筛选,如:
             List<People> peoplelist = new List<People>();
             Func<People, bool> func = p => p.Name == "张三";
             var vResult = peoplelist.Where(func); 
             //2-基于:Linq to SQL 动态编写查询条件
             IQueryable<People> peoplesQueyrabable = new List<People>().AsQueryable();
             Expression<Func<People, bool>> expression = c => c.Id == 10;
             var query = peoplesQueyrabable.Where(expression);

Expression和委托的区别

委托是一种类型,它可以封装一个或多个方法,并且可以将这些方法作为参数传递,通常用于事件处理、回调函数等场景
Expression是一个表达式树,它可以表示一个方法或者一个表达式。某些场景下比委托更加灵活。通常用于LIQN查询、ORM框架等场景
主要区别在于:
1.委托是一种类型,而expression是一个表达式树
2.委托通常用于事件处理、回调函数等场景,而 Expression 通常用于 LINQ 查询、ORM 框架等场景
3.委托只能封装方法,而expression可以表示一个方法或者一个表达式

表达式目录树的拼装(用反编译工具得到的拼装过程)

	 Expression<Func<int, int, int>> expression = (m,n) => m * n + 2;
	 Func<int, int, int> func = expression.Compile(); //调用这个可以直接转换委托
	 int iResult = func.Invoke(10, 20);
	
	//反编译的拼装结果
	ParameterExpression parameterExpressionM = Expression.Parameter(typeof(int), "m");
	ParameterExpression parameterExpressionN = Expression.Parameter(typeof(int), "n");
	BinaryExpression multiply = Expression.Multiply(parameterExpressionM, parameterExpressionN);
	//常量:2
	ConstantExpression constantExpression = Expression.Constant(2);
	BinaryExpression plus = Expression.Add(multiply, constantExpression);
	
	Expression<Func<int, int, int>> expression1 = Expression.Lambda<Func<int, int, int>>(plus, new ParameterExpression[2]
	{
	      parameterExpressionM,
	      parameterExpressionN
	});
	Func<int, int, int> func1 = expression1.Compile();
	int iResult1 = func1.Invoke(10, 20);

树结构
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值