繁体   English   中英

与SQL相比,EF Linq QUery原因锁定

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM