LINQ是“语言集成查询”的缩写。在实际应用中,对大多数人来说它有两个意义:
首先,编译器将内联委托转换为表达式树,而不是匿名方法。这意味着
x => x.Metadata.AdvisorID == advisorId
在编译时不会被编译成IL代码:相反,它会被编译成构建等效
Expression
对象的代码,这可以传递给提供程序,例如Entity Framework或LINQ to SQL,以生成数据库查询。
其次,它对大多数人来说意味着所谓的“语法糖”,它有效地代替你调用
.Where()
、
.OrderBy()
等方法。
from a in something
where a.Name == "Bob"
select a;
在这两种情况下,.NET中的
Queryable
类提供了扩展方法来构建一系列
Expression
对象,例如
.Where()
,
.OrderBy()
,
.Select()
等等。它们接受一个
IQueryable
(可以是无类型的或带有泛型参数的),并返回另一个
IQueryable
。它们在每个点轻松包装一个代表整个查询的
Expression
对象。
someQueryable.Where(x => x.Id > 3).OrderBy(x => x.Date).Select(x => x.Ref)
返回一个实现了
IQueryable
接口的对象,它包含一个类似于以下表达式的
Expression
:
Select(OrderBy(Where(someQueryable, x => x.Id > 3), x => x.Date), x => x.Ref)
...可以被LINQ提供程序读取,并生成类似于以下内容:
SELECT Ref FROM someTable WHERE Id > 3 ORDER BY Date
最后,注意
.Where()
、
.OrderBy()
等方法并不仅限于可查询/LINQ对象。它们也适用于
IEnumerable
(和
IEnumerable<>
),但这不是LINQ,只会在调用方法时立即执行操作。