02 LambdaExpression expr = Expression.Lambda(
03 Expression.Add(Expression.Constant(2), Expression.Constant(3))) // 正确,定义节点
04
05 Expression<Func<int>> expr = () => 2 + 3; //正确,定义节点
06 var expr = Expression.Lambda<Func<int>>(
07 Expression.Add(Expression.Constant(2), Expression.Constant(3))) // 正确,定义节点
08
09 Func<int> fn = () => 2 + 3; // 正确,定义委托
10 Func<int> fn = () => { return 2 + 3; } //正确,定义委托
这里问个问题,你认为下面的语句1和语句2会导致查询操作有什么区别(输出结果都是6)?答案在“LINQ那些事(8)”。
1 var context = GenerateContext();
2 Expression<Func<Customer, bool>> condition = c => c.City == "London";
3
4 var result1 = context.Customers.Where(condition); // 1
5 var result2 = context.Customers.Where(condition.Compile()); // 2
6
7 Console.WriteLine(result1.Count());
8 Console.WriteLine(result2.Count());
Query Operator
指的是在Enumerable和Queryable类中定义的用于用于对数据进行project/filter操作等的extension method,包括Where/Select/Join/OrderBy/GroupBy等。
Query Expression
刚接触LINQ的时候感觉最特别就是可以用类sql的语句在csharp代码里写查询语句
1 var result =
2 from c in context.Customers
3 where c.City == "London"
4 select c;
VS对Query expression提供了诸多支持,包括intelligent sense和编译检查等等。但select和where在IL里是没有,只是compiler在运行时根据query expression转化成对Query operator的调用。但是,并不是所有的query operator在query expression有等价表达,query expression支持的operator只有:
Select/SelectMany/Join/GroupJoin/Where/OrderBy/OrderByDescending/GroupBy/ThenBy/ThenByDescending。
既然query operator是通过extension method的方式提供,这就意味着我们可以通过自己编写extension method,来改变query expression的行为,我们看下面的代码:
01 public static class QueryOperatorExt