我使用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服务器显示它被暂停。我怀疑这可能是数据存储限制或服务器相关。但是想确保我没有在代码中做一些愚蠢的事情。
更新:
我注意到的一件事是它第一次执行第一次需要更长的时间。当我设置下一个语句再次运行它时,它会立即执行。第一次有查询编译吗?
答案 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调用它。