c# - 如何在 EF Code-First 中预编译 sql 查询?

标签 c# asp.net asp.net-mvc entity-framework sql-server-2008

我正在使用 ASP.Net4.5.1 和 EF6.0 代码优先方法。

我意识到查询需要花费相当长的时间来执行。我已使用 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)] 结合使用。

关于c# - 如何在 EF Code-First 中预编译 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876921/

相关文章:

asp.net - 在 ASP.NET Identity 2.0.0-beta1 中禁用双因素身份验证

javascript - 如何使用 javascript 从远程服务器使用 .net Web 服务

c# - 使用 C# 管理大型数据库

c# - 从回调调用时,应如何为非托管代码返回委托(delegate)?

C# 创建用于 JSON 序列化和反序列化的 .NET 对象

Jquery 验证和更新面板一起使用

c# - unity - 正弦波振荡器产生金属噪音

asp.net-mvc - Asp.Net MVC Razor Foreach 抛出 null 异常

c# - 使用 MVC 5 和 Entity Framework 下拉关联实体

asp.net-mvc - 更改表中给定行的背景颜色