我正在使用 ASP.Net4.5.1 和 EF6.0 代码优先方法。
我意识到查询需要花费相当长的时间来执行。我已使用 EF Profiler 检查查询并对查询进行微调。
我用谷歌搜索并了解到编译 Linq。
这些是我得到的链接。
- https://stackoverflow.com/questions/32175040/how-to-cache-queries-in-ef-code-first
- How do I precompile an Entity Framework Code-First Query?
- Entity Framework Compiled Query
但他们都没有解决我的问题。
假设我有以下查询。
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/