[英]EF Linq QUery cause lock compared to SQL
我有一个使用LINQ和EF的简单计数查询:
var count = (from I in db.mytable
where xyz
select I).Count();
上面的代码显示查询已锁定在数据库中。
而execute sql立即执行:
var count = db.SqlQuery<int>("select count(*) from mytable where xyz").FirstOrDefault();
上面的代码立即返回。
我很少建议删除.ToList(),但没有区别。 一件事是,这仅发生在PROD服务器上。 质量检查服务器执行得非常快。 但是生产服务器显示它已被挂起。 我怀疑这可能是数据存储限制或服务器相关。 但是要确保我没有在代码中做一些愚蠢的事情。
更新:
我注意到的一件事是,它第一次执行需要更长的时间。 当我设置下一条语句再次运行时,它立即执行。 第一次有查询编译吗?
因为您在第一个查询中调用ToList
,这将导致从DB中获取所有记录并在内存中进行计数。 除了ToList
您只需调用Count()
即可获得相同的行为:
var count = (from I in db.mytable
where xyz
select I).Count();
您不得调用.ToList()
方法,因为您开始从数据库中检索所有对象。 只需调用.Count()
var count = (from I in db.mytable
where xyz
select I).Count();
计数可以使用谓词。 我不确定它是否会加快代码的速度,但是您可以这样写计数。
var count = db.mytable.Count(x => predicate);
where谓词是您在where子句中要测试的内容。
LINQPad中的简单摆弄显示这将生成与上述类似(如果不完全相同)的SQL。 就代码简洁而言,这是最简单的方法,我知道该怎么做。
如果您需要的速度比EF所提供的速度高得多,而又不使用内联SQL来限制EF的范围,则可以创建一个存储过程并从EF调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.