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

Kgn*_*web 2 c# asp.net asp.net-mvc entity-framework sql-server-2008

我正在使用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;
  }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*att 9

是的,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)].

  • 它不仅仅是您的应用程序的基本目的.你期待什么样的负荷?它会被数百,数千或数百万人使用吗?您正在运行的查询有多复杂?还有一百万个问题可以提出来.我不期待实际答案; 我只是说,*你必须做出决定.此外,staight SQL应该被视为最后的手段.在您走这条路之前,您应该在数据库和Web服务器上投入大量的RAM并处理核心. (2认同)