繁体   English   中英

如何在EF Code-First中预编译SQL查询?

[英]How to precompile sql queries in EF Code-First?

我正在使用ASP.Net4.5.1和EF6.0 Code-First方法。

我意识到查询需要花费大量时间来执行。 我使用EF Profiler检查查询并微调查询。

我用谷歌搜索并开始编译Linq。

这些是我得到的链接。

但是没有一个能解决我的问题。

假设我有以下查询。

public IEnumerable<Student> GetStudents()
{
  using(DbContext db = new DbContext()
  {
  IQueryable<Student> query = (from c in db.Students
                                where c.Hobby== "Hockey"
                                select c);
  IEnumerable<Student> students= query.toList<Student>();

  return students;
  }
 }

现在我如何缓存查询计划或编译此Linq以提高性能?

还有一件事要问,EF比原生SQL慢吗?

我更喜欢使用EF / ORM,这是正确的选择吗?

是的,EF比SQL慢。 任何 ORM都是如此。 ORM必须能够将基于代码的“查询”转换为真正的SQL查询,然后必须使用结果来实例化对象图。 但是,这些通常是您想要 ORM的东西。 手动执行此类操作会更加困难且更容易出错。

您是否使用ORM完全取决于您的应用程序的需求。 通常,是的,建议使用ORM,但如果您需要极高的性能,则可能需要使用纯SQL。 ORM在个人表现方面也有很大差异。 已知EF是特别慢的ORM。 它是最容易使用和使用的产品之一,但如果性能是一个问题,那么你最好使用像Dapper这样的东西。 您还可以混合使用ORM和SQL。 将EF用于标准CRUD然后利用存储过程进行复杂查询完全没有异常。

总而言之,您拥有的查询非常基础。 如果您遇到类似这样的性能问题,要么您的SQL Server实例没有足够的资源来使用,您的网络速度非常慢,或者该表中有大量数据并且您没有正确使用索引。

在最后一点上,文本搜索通常是使用SQL执行速度最慢的文本搜索。 如果您打算查询特定的基于文本的列,例如Hobby ,那么您应该在其上添加索引。 您可以在数据库中手动执行此操作,也可以在属性上使用[Index]数据注释。 请记住,只能对基于文本的固定长度列进行索引。 默认情况下,EF将生成字符串属性为NVARCHAR(MAX) 如果要对列使用索引,则需要将[Index][MaxLength(N)]

如果您想要更快的数据访问代码,您应该考虑使用Pure ADO.NET代码,该代码使用SqlCommandSqlDataReaderExecuteReader方法执行SQL查询。 但是现在你需要编写一些额外的代码来创建一个SqlCommand ,传递查询和参数并从SqlDataReader读取行。

你应该考虑像Dapper这样的迷你ORM。 它比EF快。 如上所述,您不需要编写太多代码。 Dapper将执行您的查询并将结果集映射到您的DTO。

使用Dapper的快速示例。

var con= new SqlConnection("YourConnectionStringGoesHere");
var posts = con.Query<Post>("SELECT ID,Name from Post");

Dapper支持从多个表(JOIN)读取数据并映射到具有Navigation属性的对象。

看看他们的表现数字 在此输入图像描述

EF / NHibernate将帮助您进行快速开发,因为它很容易通过API /方法与数据库通信。 但是你要为表现买单。

另外要记住的重要一点是优化您的SQL查询。 即使使用纯ADO.NET,如果未优化sql查询,也会导致性能下降。 为表/列添加适当的索引也可能有所帮助。

我不完全确定您的应用程序,但您应该阅读有关缓存数据的信息,以便您的数据库不会一直被打中。 这通常会提高您的表现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM