与Lin相比,EF Linq Query导致锁定

时间:2015-01-07 18:06:26

标签: c# linq entity-framework

我使用LINQ和EF进行简单的计数查询:

var count = (from I in db.mytable
             where xyz
             select I).Count();

上面的代码显示查询被锁定在数据库中。

执行sql立即执行:

var count = db.SqlQuery<int>("select count(*) from mytable where xyz").FirstOrDefault();

上面的代码立即返回。

我很少有人建议删除我所做的.ToList()并没有区别。有一点是,这只发生在PROD服务器上。 QA服务器按预期执行得非常快。但prod服务器显示它被暂停。我怀疑这可能是数据存储限制或服务器相关。但是想确保我没有在代码中做一些愚蠢的事情。

更新:

我注意到的一件事是它第一次执行第一次需要更长的时间。当我设置下一个语句再次运行它时,它会立即执行。第一次有查询编译吗?

3 个答案:

答案 0 :(得分:1)

因为您在第一个查询中调用ToList并导致从DB获取所有记录并在内存中进行计数。您可以只调用ToList来获取相同的行为,而不是Count()

var count = (from I in db.mytable
              where xyz
              select I).Count();

答案 1 :(得分:0)

您不能调用.ToList()方法,因为您开始从数据库中检索所有对象。 只需致电.Count()

var count = (from I in db.mytable
             where xyz
             select I).Count(); 

答案 2 :(得分:0)

Count可以采用谓词。我不确定它是否会加速你的代码,但你可以写这样的计数。

var count = db.mytable.Count(x => predicate);

谓词是你在where子句中测试的内容。

LINQPad中的简单摆弄表明,这将生成与上述类似的SQL(如果不完全相同)。这是最简单的方法,在简洁的代码中,我知道如何做到这一点。

如果您需要比EF提供的更高的速度,但是在不使用内联SQL的情况下保持EF的范围,您可以创建存储过程并从EF调用它。