浏览我最喜欢的作者之一的问题 LINQ 最难或最容易被误解的方面是什么? 我基本上是在寻找问题的答案:
C# 编译器如何处理查询表达式?
编译器将在进一步编译代码之前评估您的查询表达式并将其转换为等效的 lambda 语法。所以代码以
开头 var query = from foo in foos
where foo.Bar == someString
select new
{
Baz = foo.Baz,
Id = foo.Id
};
将转化为lambda版本
var query = foos.Where(f => f.Bar == someString).Select(f => new { Baz = f.Baz, Id = f.Id });
对于复杂的连接、分组等也会发生同样的情况。
底层 LINQ 提供商的答案可能有所不同。
一般来说,LINQ 查询表达式或方法链在进入特定于提供程序的实现之前会转换为表达式树。
对于 LINQ to Objects (IEnumerable),表达式树被编译成一组 System.Func 或 System.Action 委托。
对于 LINQ to SQL (IQueryable),表达式树转换为 T-SQL 语句。