自从Linq提出了之后,让很多的开发人员一阵的狂喜,编写代码似乎比以前更别的方便了,特别是随着Linq2Sql等推出来之后,开发人员感到了似乎手中有了强大的武器。同时,Linq2Sql带来的问题不断的出现,特别实在性能上面,这是让很多的多性能有着高要求的应用要放弃Linq2Sql系列技术的原因,并且很多回到了以前的ADO.NET技术,追求完全的控制。
这里和大家分享一些知识。我们本篇文章不对谈了Linq系列技术是否好,是否改用,而是告诉那些将会或者已经使用了Linq技术的朋友,如何来提升Linq2Sql查询的性能。
在本篇文章中,我们首先会介绍Linq2Sql查询是如何被执行的,然后我们介绍如何来编译Linq查询从而使得其性能提升。
本篇希望大家对Linq2Sql查询,特别是Linq2Sql的使用有一定的经验。
深入的查看Linq2Sql查询的工作原理
首先我们来看看下面的一个简单的Linq查询,这个查询非常的简单,就是从一个Customer表中获取数据,这个Linq的查询被Linq的引擎转换为SQL语句,如下:
对于一个Linq查询,首先,需要检查它的语法,词法,最后产生SQL语句。这个过程可以说是非常耗时的,并且对于每个Linq查询都要这样做。如果我们可以将每一个Linq查询的查询计划缓存的话,那么就快了。
其实这个原理和我们使用SQL Server一样:把SQL Server提交到数据库,首先执行词法语法分析,然后生成查询树,然后再交给查询优化器,生成执行计划,然后交给执行引擎去执行,最后又存储引擎获取数据,并且生成的执行计划被缓存,以便重用,这样就极大的提升了性能,更多请看这里。
在Linq技术中,提供了一种名为编译Linq查询的技术。在编译的Linq查询中,Linq生成的执行计划被缓存在一个静态的类中。我们知道,静态类是一个全局的公共资源,所以Linq查询可以去这个静态类中找到相应的执行计划,而不是每次都去解析,如下:
从上图中可以看到:从Linq的查询到最后的执行解析成为SQL去执行,需要经历四个步骤,如果没有缓存Linq查询的执行计划,那么其实就是有5个步骤的,如下:
如何编写编译的Linq查询
既然已经知道了编译查询可以提升性能,那么我们就来看看具体的如何操作。
首先就要导入System.Data.Linq命名空间。
然后,为了避免一上来就丢上一大堆代码使得朋友们不舒服,我们就一点点的来进行:
-
- 首先定义一个静态的类:clsCompiledQuery
- 然后添加一个公共的静态方法指针变量,签名如下:
那么对于这个方法:
a. 这个方法的参数要首先接受一个DataContext对象
b. 这个方法可以随后接受一个或者多个输入参数,现在在我们的例子中,我们就接受了一个string类型的输入参数,因为我们的上面的customer的查询只是传入了一个txtCustomer.Text的值。
c. 我们需要定义类型为IQueryable的输出参数。
3. 定义好了方法指针的变量之后,我们就可以调用CompiledQuery类的方法Compiled,并且将DataContext与一个string作为输入参数,如下:
4. 整个方法指针的定义完整代码如下:
5.整个静态类的定义如下:
上面的准备工作做好了之后,我们就开始使用。可以在需要的地方进行如下的调用:
分享到:
相关推荐
改善LINQ查询性能的提示。
使用.Net查询AutoCAD图形数据库,AutoCAD.net,英文文档但是是word,可复制配合百度翻译,部分配注记,Linq查询autocad,推荐看一下,说不定就可以提高程序性能
在LINQ概念的C#中使用struct进行实现,以大大减少内存分配并提高性能。 当元素为胖结构时,引入IRefStructEnumerable以提高性能。 安装 该库通过分发。 要安装 : PM> Install-Package StructLinq 要安装BCL包装...
NetFabric.Hyperlinq NetFabric.Hyperlinq包含System.Linq命名空间中许多操作的替代实现: 通过使方法调用成为非...通过执行以下所有操作, NetFabric.Hyperlinq可以比System.Linq更快地枚举查询结果: 将多个枚举器
支持 LINQ 查询语言:NPOI 支持使用 LINQ 查询语言进行数据筛选和分析。这极大地简化了数据处理的过程,提高了代码的可读性和可维护性。 兼容性良好:NPOI 插件兼容多种版本的 Unity 和 .NET Framework,并支持多种...
该结构主要取自但经过清理和优化,性能提高了约 30%。MTConnect.Probe() MTConnect.Probe() 获取所有设备,但不获取当前结果集。 如果您需要在流中获取设备但当时不需要数据,这很好。 MTConnect.Probe 将在每次...
社区推动提高C#性能。 熟悉的接口,类似于标准C#算法和Linq。 免费,开源,位于nuget.org上算法* ** 上证所多核数组清单细节2 14 :check_mark: :check_mark: :check_mark: 按元素添加两个数组1个2 :check_mark: :...
您可以通过为LINQ库不提供的操作添加新运算符,或者通过创建自己的标准查询运算符实现来提高可读性和性能,从而扩展Rx。 编写自定义版本的标准LINQ操作符在您希望使用内存中对象操作时以及当预期自定义不需要查询的...
在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、...使用I/O线程提高服务器应用程序性能 使用PLINQ并行化LINQ查询 使用Windows 8异步API 使用Reactive Extensions运行异步操作并管理选项
基于B/S的应用结构,使软件的二次开发性能大大提高, 基本资料:公司信息 往来单位 业务中心:客户关系 合同管理 报表中心:刊登统计 到期提醒 资料管理:文件管理 系统维护:修改密码 用户维护 角色管理 开发环境为...
例如,基于 .NET Framework 的客户端可以使用 LINQ 查询数据服务,也可以使用简单的 .NET Framework 对象层更新此服务中的数据。 现在,Windows Communication Foundation 改进了对互操作性的支持,增强了部分受...
.NET Framework 4 还显著提高了基于 WF 的工作流的性能。 有关 WF 的增强功能的完整列表,请转到此处。 Windows Communication Foundation (WCF) 的改进,例如对 WCF 工作流服务的支持(可启用带消息传递活动的工作...
项目出于各种各样如性能的类原因没有采用但非常适合小型快速开发减轻了员工作量也提高了代码可读性 ;C#4.0增加了动态语言特性从里面可以看到很多javascript、python这些动态语言影子虽然越来越偏离静态语 言道路但...
当你查询你的数据库时使用熟悉的LINQ架构。假如这还不够,它还提供2种其它选项,标准的OQL和直接SQL。不管什么语言,它提供的一切方法为让轻松地查询你的数据。 建立时字节码增强 没有源代码生成,简单化理解持久...
C#语言结合了C++的强大功能和Java的易用性,同时增加了许多创新的特性,例如LINQ(语言集成查询)和异步编程等,使其成为构建现代、高性能、可扩展和可维护的应用程序的理想选择。 以下是C#语言的一些关键特性和...
.NET Framework 4 还显著提高了基于 WF 的工作流的性能。 有关 WF 的增强功能的完整列表,请转到此处。 Windows Communication Foundation (WCF) 的改进,例如对 WCF 工作流服务的支持(可启用带消息传递活动的...
随着函数式编程的概念通过 .NET 泛型和 LINQ 等技术越来越多地渗入主流语言(例如 C# 和 Visual Basic®),F# 在 .NET 社区里的知名程度也不断提高——因此,2007 年 11 月 Microsoft 宣布将 F# 确定为受支持的 ...