LINQ学习笔记:解释查询(Interpreted Queries)
们补充到之前定义的集合当中去. 但针对远程查询, 这是很困难的, 甚至是不合需要的. 如果你编写了一个MyWhere的IQueryable<>扩展方法, 这就像你将一个你自己的产品(比如手机)放到一条生产笔记本的生产线上, 生产线上的机器根本无法处理. 即使你在这个阶段进行干预, 你的解决方案你将与一个特殊的provider绑定在一起, (就像LINQ to SQL一样), 并且不能和其他的IQueryable的实现一起工作. Queryable拥有的一系列方法的好处之一就是他们定义了操作远程集合的标准词汇-_-, 不过当你试图扩展这些词汇时, 他们就不再是可互操作的.
此模型引起的另外一个结果是一个IQueryable Provider可能无法处理某些查询, 甚至是某些标准方法也是如此. 例如LINQ to SQL, 有些LINQ查询是无法对应的SQL语法的, 这取决于目标数据库服务器. 如果你对SQL非常熟悉, 你会对它们(那些可能无法翻译的Query)有个直观的感觉, 虽然通常情况下你可能需要进行一些实验才能了解到底是什么引起了运行时的错误, 那些翻译后的SQL语句可能会令你感到惊讶. 使用最新版本的SQL SERVER进行工作是你的最佳选择. AsEnumerable Enumerable.AsEnumerable是所有操作符中最简单的一个, 它的完整定义是: 1: public static IEnumerable AsEnumerable 2:
3: (this IEnumerable source) 4:
5: {
6:
7: return source; 8:
9: }
它的主要目的是将IQueryable转换成一个IEnumerable, 这将会强制将子序列绑定到Enumerable中的操作符而不是Queryable当中的.这意味着其后的执行都将会是在本地执行的. 举个例子, 假设我们有一个Article表存在于SQL SERVER当中, 我们想使用LINQ to SQL列出所有Topic等于LINQ并且Content包含超过500个字符的文章: 1: Regex reg = new Regex (@”\b(\w|[-’])+\b”); 2:
3: var query = dataContext.Articles
4:
5: .Where (article => article.Topic ==“LINQ” &&
6:
7: reg.Matches (article.Content).Count > 500);
这里的问题是SQL SERVER并不支持正则表达式, 因此上面的Query将无法运行. 为了解决这个问题, 我们可以将其分成2步查询: 1: Regex reg = new Regex (@”\b(\w|[’])+\b”); 2:
3: IEnumerable sqlQuery =
4:
5: dataContext.Articles
6:
7: .Where (a => a.Topic == “LINQ”);
8:
9: IEnumerable localQuery =sqlQuery
10:
11: .Where (a => reg.Matches (a.Content).Count > 500);
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |