首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么直接sql立即返回时,实体框架计数语句超时?

为什么直接sql立即返回时,实体框架计数语句超时?
EN

Stack Overflow用户
提问于 2014-02-20 17:32:47
回答 2查看 1.5K关注 0票数 2

我们最近从out数据库中删除了大量记录。删除之后,从生成的语句将超时。我们也设置SET事务隔离级别,为这些语句读取未提交的数据。

实体框架代码

代码语言:javascript
复制
_emailSendResultsRepository.GetTable().Count(e => e.EmailId == email.Id && e.SendDate >= startDate);

生成此sql。

代码语言:javascript
复制
SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[EmailSendResults] AS [Extent1]
        WHERE ([Extent1].[EmailId] = @p__linq__0) AND ( CAST( [Extent1].[SendDate] AS datetime2) >= @p__linq__1)
)  AS [GroupBy1]    
  • 如果我通过运行相同的语句,它将立即返回。
  • 在没有日期返回的情况下对同一表进行计数。
  • 所有其他数据调用似乎都正常工作。

有什么想法会导致超时吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-21 16:06:41

它可能对你没有直接的帮助,但请结帐:

Which method performs better: .Any() vs .Count() > 0?

还没有像您所描述的那样出现任何性能问题,我将对表中记录是否存在的检查从.Count()更改为.Any()。但这可能只会对你有帮助,当你真的不需要精确的计数时。此外,我需要指出的是,我目前不删除大型表中的任何记录,通常在检查.where()之前,我将执行.count()子句。

当您将查询更改为.Where()时,可以尝试在收集.Count()的详细信息之前检查.Count()。

代码语言:javascript
复制
var queryList = _emailSendResultsRepository.GetTable()
    .Where(e => e.EmailId == email.Id)
    .Where(e.SendDate >= startDate)
    .ToList();

    if (queryList.Any())
    {
        ....
        queryList.Count()....
        ....
    }

msdn论坛的一篇文章中提到:

“但是,即使从表中选择COUNT(*),在大型表上也会效率很低,就像Server进行全表扫描一样。”

票数 1
EN

Stack Overflow用户

发布于 2015-09-08 07:54:50

实际上,MarkusEgle,您提供的声明:

代码语言:javascript
复制
var queryList = messages
.Where(t => t.LogTimeStamp >= fromDate)
.Where(t => t.LogTimeStamp <= toDate)
.Where(t => t.LogType != stateInfoNoAuditFile)
.OrderBy(m => m.LogID)
.ToList();

执行查询并获取结果,因此如果然后调用queryList.Count --它根本不碰数据库,它只是对列表中的对象(内存)进行计数。您应该删除ToList以获得所需的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21915324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档