在导入LINQ后输入'from'(在System.Linq namespace查询中)时,它被理解为关键字。这种魔力是如何发生的?
来自某种类型的扩展方法吗?
答案 0 :(得分:6)
实际上,是的 - LINQ关键字映射到扩展方法。但实际上,它更有趣;从字面上看,编译器直接替换了一些关键方法,即
var qry = from cust in db.Customers
where cust.IsActive
select cust;
变为:
var qry = db.Customers.Where(cust => cust.IsActive);
(如果我们有一个非平凡的选择,它会添加。选择(...一些投影...)
不同的LINQ密钥映射到不同的方法 - 即有OrderBy,GroupBy,ThenBy,OrderByDescending等。
如果是IEnumerable<T>
/ IQueryable<T>
,则会通过扩展方法解析这些问题(通常由Enumerable
/ Queryable
提供) - 但是,如果您的可查询对象已声明他们自己的Where / OrderBy / etc然后会优先使用这些。
Jon Skeet在C# in Depth的后半部分更多地介绍了这一点。我也看过an example of Jon's,在那里他讨论了一些非常奇怪的含义 - 比如在类型上调用静态方法。
答案 1 :(得分:4)
Marc Gravell answered the question admirably,但我无法抗拒提及weird things you can do with query expressions的诱惑。编译器真的不在乎它如何找到“选择”成员,或“何处”等等。
在进行正常编译之前,编译器将代码转换为“没有查询表达式的C#3.0”的方式非常漂亮 - 这是将新功能引入语言的一种很好的方式,但只对规范的一个独立部分产生影响
答案 2 :(得分:-1)
“from”是一个语言关键字(就像“if”或“foreach”)。
您甚至不需要导入System.Linq来使用“from”,但您需要使用3.5框架。