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,这是正确的选择吗?
是的,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)].
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |