C# 当直接sql立即返回时,为什么实体框架会计算语句超时?

C# 当直接sql立即返回时,为什么实体框架会计算语句超时?,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我们最近从数据库中删除了大量记录。删除后,从实体框架生成的此语句将超时。我们还将为这些语句设置事务隔离级别READ UNCOMMIT 实体框架代码 _emailSendResultsRepository.GetTable().Count(e => e.EmailId == email.Id && e.SendDate >= startDate); 生成此sql SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT

我们最近从数据库中删除了大量记录。删除后,从实体框架生成的此语句将超时。我们还将为这些语句设置事务隔离级别READ UNCOMMIT

实体框架代码

_emailSendResultsRepository.GetTable().Count(e => e.EmailId == email.Id && e.SendDate >= startDate);
生成此sql

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]    

如果我通过Sql management studio运行相同的语句,它将返回 马上。 在不快速返回日期的情况下计数到同一个表 所有其他数据调用似乎都工作正常。
有什么想法会导致超时吗?

它可能不会直接帮助您,但请结帐:

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

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

var queryList = _emailSendResultsRepository.GetTable()
    .Where(e => e.EmailId == email.Id)
    .Where(e.SendDate >= startDate)
    .ToList();

    if (queryList.Any())
    {
        ....
        queryList.Count()....
        ....
    }
在美国的一个职位上 其中提到: 但在大型表上,即使是SELECT COUNT*FROM Table也会非常低效,因为SQL Server会执行完整表扫描。

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

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以获得所需的结果。

为什么要调用。GetTable?另外,您可以对同一数据库进行其他调用吗?您是否收到任何错误?是否尝试分析发送到服务器的代码?这应该给你一个很好的线索。我有点惊讶EF没有为你生成参数化SQL。它应该使用Sql Server Profiler。如果我通过Sql management studio运行相同的语句,它会立即返回。-正如您的编辑所显示的,您没有从ManagementStudio运行相同的语句。如果从ManagementStudio运行相同的语句,会发生什么情况?从探查器复制精确的文本。这应该涉及sp_executesql系统存储过程。