初认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);
树结构