LINQ学习笔记:解释查询(Interpreted Queries)
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 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |