数据点-预编译LINQ查询

在应用程序中使用 LINQ to SQL 或 LINQ to Entities 时,有必要考虑对您 创建并重复执行的任何查询进行预编译。我经常在埋头苦干一项特定任务时忘了 利用预编译查询,等我意识到时为时已晚。这很像“异常处理病”,即开发人员 试图在事发后将异常处理强行加入应用程序中。

然而,即使您已经实施了此项重要的性能增强方法,往往也只是徒劳。您可 能会发现预期的性能增强并未实现,但原因(和解决方法)可能仍悬而未决。

在本篇专栏文章中,我首先将解释如何预编译查询,然后将重点讲述在 Web 应用程序、服务和其他方案中导致预编译无用的原因。您将学习如何确保在回发 、短期服务操作以及其他会导致关键实例超出作用域的代码中获得性能优势。

预编译查询

在庞大的查询执行中,将 LINQ 查询转换为相关的存储查询(例如,数据库 执行的 T-SQL)需要较高的成本。图 1 显示了将 LINQ to Entities 查询转换 为存储查询时涉及的流程。

图 1 将 LINQ 查询转换为相关的存储查询

实体框架团队的博客文章“探讨 ADO.NET 实体框架的性能 – 第 1 部分” (blogs.msdn.com/adonet/archive/2008/02/04/exploring-the-performance- of-the-ado-net-entity-framework-part-1.aspx) 对该流程进行了细分,并提 供了每个步骤的对应时间。注意:此篇文章基于 Microsoft .NET Framework 3.5 SP1 版本的实体框架,新版本中各步骤的时间分配可能发生了变化。但查询 执行流程中的预编译成本仍然较高。

通过预编译查询,实体框架和 LINQ to SQL 可以重复使用存储查询并跳过每 次计算的冗余流程。例如,如果您的应用程序经常从数据存储中检索不同的客户 ,您可能会有一个与下面类似的查询:

Context.Customers.Where(c=>c.CustomerID==_custID)

在从一个执行进入下一个执行时,如果只有 _custID 参数发生了变化,为什 么要浪费时间将此查询反复转置到 SQL 命令呢?

LINQ to SQL 和实体框架都启用了查询预编译,但由于这两个框架中的流程 不同,它们的 CompiledQuery 类也不同。LINQ to SQL 使用 System.Data.LINQ.CompiledQuery,而实体框架使用 System.Data.Objects.CompiledQuery。这两种形式的 CompiledQuery 都允许您 传入参数,而且都要求您传入当前正在使用的 DataContext 或 ObjectContext 。从编码的角度来说,它们在本质上是相同的。

CompiledQuery.Compile 方法以 Func 的形式返回一个委托,在需要时可以 调用该委托。

以下是实体框架的 CompiledQuery 类编译的一个简单查询,由于是静态查询 ,因此不要求实例化:

C#

var _custByID = CompiledQuery.Compile<SalesEntities,  int, Customer>
   ((ctx, id) =>ctx.Customers.Where(c=> c.ContactID  == id).Single());

VB

Dim _custByID= CompiledQuery.Compile(Of SalesEntities,  Integer, Customer)
   (Function(ctx As ObjectContext, id As Integer)
   ctx.Customers.Where(Function(c) c.CustomerID =  custID).Single)

时间: 2024-08-30 02:34:07

数据点-预编译LINQ查询的相关文章

JDBC之PreparedStatement类中预编译的综合应用解析

SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句   预编译的优点1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数

JDBC之PreparedStatement类中预编译的综合应用解析_java

预编译的优点1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支

jsp往数据库写数据预编译的时候出现乱码

问题描述 jsp往数据库写数据预编译的时候出现乱码 今天写了个注册系统,可是我往数据库里写数据时出现"???"乱码,但是预编译之前 的值都是正常的,jsp页面是utf-8的,servlet也没有问题,数据库也是utf-8的,只是使用 PreparedStatement就出现乱码了 解决方案 看看数据库定义的字段是什么,用nvarchar看看 解决方案二: 可能是 设置datasource 的driver 没有指定编码~ 路径查查看

SQL预编译和SQL注入

再说SQL预编译: 最近用go语言时,学习了一下数据库连接的库,这里总结一下SQL预编译相关的知识.貌似网上都是建议使用预编译,我也觉得这种做法靠谱. 先谈 SQL注入: SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过让原SQL改变了语义,达到欺骗服务器执行恶意的SQL命令.其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统. 其实,反过来考虑,这也是SQL这类解释性语言本身的缺陷,安全和易用性总是相对的.类似的Sh

LINQ查询操作中的类型关系

查询操作中的类型关系 (LINQ) 若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的.如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例.另外,还能了解在使用 var 隐式对变量进行类型化时的后台操作. LINQ 查询操作在数据源.查询本身及查询执行中是强类型的.查询中变量的类型必须与数据源中元素的类型和 foreach 语句中迭代变量的类型兼容.此强类型保证在编译时捕获类型错误,以便可以在用户遇到这些错误之前更正它们. 为了演示这些类型关系,下面

LINQ To SQL深入学习系列之四 LINQ查询基础

本文部分内容整理自msdn 一.LINQ的概念: LINQ是Language Integrated Query(语言集成查询)的简称,它是集成在.NET编程语言中的一种特性 ,这使得查询表达式可以得到很好的编译时语法检查,丰富的元数据,智能感知等强类型语言的好处LINQ 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间 架起了一座桥梁. 二.LINQ出现的背景: 传统上,针对数据的查询都是以简单的字符串表示,而没

LINQ查询表达式基础描述

本文向大家介绍LINQ查询表达式,可能好多人还不了解LINQ查询表达式,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西. LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ to XML).Databases(LINQ to SQL.LINQ to Dataset.LINQ to Entities)和对象(LINQ to Objects).LINQ也是可扩展的,允许你建立自定义的LINQ数据提供者(比如:LINQ to Amazon.LINQ to N

LINQ查询操作全面分析

学习LINQ查询时,经常会遇到LINQ查询操作问题,这里将介绍LINQ查询操作问题的解决方法. 语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁. 传统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持.此外,您还必须针对以下各种数据源学习不同的查询语言:SQL 数据库.XML 文档.各种 Web 服务等.LINQ 使查询成为

LINQ 查询语法

        在LINQ中,数据源和查询结果实际上都是IEnumerable<T>或IQueryable<T>类型对象           LINQ主要的功能就是实现查询,LINQ查询存在以下两种形式.           ⑴ Method Synta (查询方法方式):主要利用 System.Linq.Enumerable 类中定义的扩展方法和Lambda 表达式方式进行查询.它提供了一种增强了程序的可读性的语法,易读易写,写时不容易出错.Visual Studio 2010为