【发布时间】:2008-10-10 11:45:54
【问题描述】:
当我在导入System.Linq namespace 后键入'from'(在LINQ 查询中)时,它被理解为关键字。这种魔法是如何发生的?
'from' 是某种类型的扩展方法吗?
【问题讨论】:
当我在导入System.Linq namespace 后键入'from'(在LINQ 查询中)时,它被理解为关键字。这种魔法是如何发生的?
'from' 是某种类型的扩展方法吗?
【问题讨论】:
实际上,是的 - LINQ 关键字映射到扩展方法。但实际上,它更有趣;从字面上看,就好像编译器直接替换了一些关键方法,即
var qry = from cust in db.Customers
where cust.IsActive
select cust;
变成:
var qry = db.Customers.Where(cust => cust.IsActive);
(如果我们有一个重要的选择,它会添加 .Select(...some projection...)
不同的 LINQ 关键字映射到不同的方法 - 即有 OrderBy、GroupBy、ThenBy、OrderByDescending 等。
在 IEnumerable<T>/IQueryable<T> 的情况下,然后通过扩展方法解决这些问题(通常由 Enumerable/Queryable 提供)- 但是,如果您的可查询对象声明了自己的 Where/OrderBy/etc,那么这些会被优先使用。
Jon Skeet 在C# in Depth 的后半部分对此进行了更多介绍。我还看到了an example of Jon's,他在其中讨论了一些非常奇怪的含义——比如在一个类型上调用静态方法。
【讨论】:
Marc Gravell 有answered the question admirably,但我无法抗拒提及weird things you can do with query expressions 的诱惑。编译器真的不太关心它是如何找到“Select”成员或“Where”等的。
编译器在进行正常编译之前将代码翻译成“没有查询表达式的 C# 3.0”的方式真的很漂亮——这是一种将新功能引入语言的绝妙方式,但只对规范的一个孤立部分产生影响.
【讨论】:
“from”是一个语言关键字(就像“if”或“foreach”一样)。
您甚至不需要导入 System.Linq 即可使用“from”,但您需要使用 3.5 框架。
【讨论】: