当我在导入System.Linq命名空间后输入'from'(在LINQ查询中)时,它被理解为关键字.这种魔力是如何发生的?
是'来自'某种类型的扩展方法?
在实践中,是 - LINQ关键字映射到扩展方法.但实际上,它更有趣; 从字面上看,编译器直接替换了几个关键方法,即
var qry = from cust in db.Customers where cust.IsActive select cust;
变为:
var qry = db.Customers.Where(cust => cust.IsActive);
(如果我们有一个非平凡的选择,它会添加.选择(...一些投影...)
不同的LINQ kewords映射到不同的方法 - 即有OrderBy,GroupBy,ThenBy,OrderByDescending等.
在IEnumerable
/ 的情况下IQueryable
,然后通过扩展方法解析这些(通常由Enumerable
/提供Queryable
) - 但是,如果您的可查询对象声明了自己的Where/OrderBy/etc,那么这些将被优先使用.
Jon Skeet 在深度C#的后半部分更多地介绍了这一点.我还看到了Jon的一个例子,他在这里讨论了一些非常奇怪的含义 - 例如在类型上调用静态方法.