C#将LINQ查询转换为SQL查询

示例

该IQueryable和IQueryable<T>接口允许开发人员翻译LINQ查询(一“语言集成”查询)到特定数据源,例如关系数据库。采取用C#编写的LINQ查询:

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

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

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

  • 该类的Author属性有一个谓词Book;

  • 所使用的比较方法是“等于”(==);

  • 应该等于的值是"Stephen King"。

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

select *
from Books
where Author = 'Stephen King'

在query变量(IQueryable实现IEnumerable)上迭代时,将调用提供程序。

(此示例中使用的提供程序将需要一些额外的元数据,以知道要查询哪个表,并知道如何将C#类的属性与表的列进行匹配,但是此类元数据不在IQueryable接口的范围之内。)