将 LINQ 查询转换为 SQL 查询

IQueryableIQueryable<T> 接口允许开发人员将 LINQ 查询(语言集成查询)转换为特定数据源,例如关系数据库。拿这个用 C#编写的 LINQ 查询:

var query = from book in books
            where book.Author == "Stephen King" 
            select book;

如果变量 books 是实现 IQueryable<Book> 的类型,那么上面的查询将以表达式树的形式传递给提供者(在 IQueryable.Provider 属性上设置),表达式树是反映代码结构的数据结构。

提供程序可以在运行时检查表达式树以确定:

  • Book 类的 Author 属性有一个谓词;
  • 使用的比较方法是’等于’(==);
  • 它应该相等的价值是 Stephen King

有了这些信息,提供程序可以在运行时将 C#查询转换为 SQL 查询,并将该查询传递给关系数据库,以仅获取与谓词匹配的书籍:

select *
from Books
where Author = 'Stephen King'

query 变量被迭代时,提供者被调用(IQueryable 实现 IEnumerable)。

(此示例中使用的提供程序需要一些额外的元数据才能知道要查询的表以及如何将 C#类的属性与表的列匹配,但此类元数据超出了 IQueryable 接口的范围。)