如何在LINQ和C#中实现'from / where / select'关键字?

时间:2008-10-10 11:45:54

标签: c# .net linq

在导入LINQ后输入'from'(在System.Linq namespace查询中)时,它被理解为关键字。这种魔力是如何发生的?

来自某种类型的扩展方法吗?

3 个答案:

答案 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框架。