快速业务通道

LINQ学习笔记:解释查询(Interpreted Queries)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13

LINQ to SQL将会把这个查询翻译成以下的SQL脚本:

   1: SELECT UPPER([t0].[Name]) AS [value]
   2:     FROM [Customer] AS [t0]
   3:     WHERE [t0].[Name] LIKE ''%a%''
   4: ORDER BY LEN([t0].[Name])

并输出结果:

AMY
JAMES

DANIEL

CARDER

Interpreted查询是如何工作的?

让我们查看一下前面提到的查询是如何运行的.

首先, 编译器将这个复合查询转换成Lambda表达式语法. 这个跟本地查询的做法是一样的:

IQueryable<string> q = customers

.Where (n=> n.Name.Contains (”a”))

.OrderBy (n => n.Name.Length)

.Select (n => n.Name.ToUpper());

接下来,编译器将会解析查询操作方法, 这里就是本地查询和Interpreted查询的不同的地方了 – Interpreted查询将会使用Queryable类型中的查询方法而不是Enumerable类型中的.

要了解为什么, 我们需要查看一下customers变量, 这是创建整个查询的源头. Customers是一个Table<>类型, 其实现了IQueryable<>(这同时又是一个IEnumerable<>的子类型). 这意味着编译器在解析Where的时候有一个选择: 可能调用Enumerable中的扩展方法, 或者Queryable中的扩展方法:

   1: public static IQueryable<TSource> Where<TSource> (
   2:   this IQueryable<TSource> source,
   3:   Expression <Func<TSource,bool>> predicate)

编译器最终选择Queryable.Where因为它的签名更加明确的匹配.

注意, Queryable.Where接受一个在Expression类型中的predicate包装, 这会指示编译器翻译Lambda表达式(n=>n.Name.Contains(“a”))到一个表达式树而不是一个编译的委托. 表达式树是一个基于System.Linq.Expressions的对象模型, 其可以在运行时被检视, 因此LINQ to SQL可以被翻译成SQL表达式.

执行

Interpreted查询遵循一个延迟执行模型,类似本地查询,这意味着只有当你开始枚举Query的时候SQL语句才会被生成. 并且, 枚举相同的Query两次将会对同样对数据库发起两次查询, 因此要小心避免引起性能问题.

Interpreted查询不同于本地查询的地方在于如何执行.当你开始枚举一个Interpreted查询的时候, 最外层的序列会运行一个程序横贯整个表达式树,将其处理成一个单元. 在我们的例子中,LINQ to SQL将表达式树翻译成SQL表达式, 然后运行并返回结果序列.

另外, 针对本地查询,我们可以非常方便的使用迭代器编写自己的扩展方法并将它

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号