C# 运行存储过程时实体框架问题

C# 运行存储过程时实体框架问题,c#,sql-server,entity-framework,stored-procedures,C#,Sql Server,Entity Framework,Stored Procedures,我对存储过程和实体框架有问题 让我解释一下发生了什么。。。以及我迄今为止所做的尝试 我有一个存储过程,它不会做很多事情 SELECT COUNT(DISTINCT(EmailAddress)) AcceptedQuotes, CONVERT (DATE,QuoteDate) QuoteDate FROM Quote Q JOIN Person P on Q.PersonPk = P.Pk JOIN Product Pr on Q.ProductPk

我对存储过程和实体框架有问题

让我解释一下发生了什么。。。以及我迄今为止所做的尝试

我有一个存储过程,它不会做很多事情

SELECT 
    COUNT(DISTINCT(EmailAddress)) AcceptedQuotes, 
    CONVERT (DATE,QuoteDate) QuoteDate
FROM
    Quote Q
JOIN 
    Person P on Q.PersonPk = P.Pk
JOIN 
    Product Pr on Q.ProductPk = Pr.Pk
JOIN 
    Accepted A on Q.Pk = A.QuotePk
WHERE               
    QuoteDate between @startDate and @endDate
    AND CompanyPk = @companyPk
    AND FirstName != 'Test'
    AND FirstName != 'test'
    AND FirstName != 'EOH'
我想执行这个,它在SSMS中运行良好,甚至不需要1秒

现在,我将它导入实体框架,它超时,我将命令超时设置为120

好的,那么到目前为止我已经尝试了什么,我已经测试了什么

如果我使用
SqlCommand
SqlDataAdapter
DataTable
方式,并使用自己的连接字符串,它将按预期执行。当我在这个场景中使用实体框架连接字符串时,它会超时

我修改了我的存储过程以包含“重新编译”选项,还尝试了
设置ARITHABORT
方式,运气不好,当运行EF时超时

这是EF中的错误吗

我现在刚刚决定使用“旧式”数据访问重写这个

还请注意,EF与来自同一数据库的其他存储过程一起执行良好

任何想法或帮助都将不胜感激

附:我找到了这篇文章,但也没有帮助:(

这可能是由以下原因引起的

当编译或重新编译存储过程时,为该调用传递的参数值将被“嗅探”并用于基数估计。最终的效果是,计划得到了优化,就像那些特定的参数值在查询中被用作文本一样

  • 使用不直接显示在参数上的虚拟变量也可以确保执行计划的稳定性,而无需添加重新编译 提示,示例如下:
  • 创建过程dbo.SearchProducts @关键字varchar(100)As Declare@Keyworddummy As varchar(100)Set@Keyworddummy=@Keyword select*来自关键字类似的产品 @关键词虚拟

  • 要防止出现这种情况和其他类似情况,可以使用以下查询选项:
  • 优化重新编译

  • 在批处理期间禁用自动更新统计信息

  • 您是否可以尝试更简单的查询,而不使用任何where cluase,如select TOP 1,并查看是否得到结果。您可以发布用于执行此查询的代码吗?此外,尝试使用sql server profiler查看引擎盖下发生的情况。也许您在EF情况下传递了错误的参数值?嗯,我运行了探查器,EF正在杀死数据库服务器。CPU 30123,读取1364453什么该死的,这被更改为不使用带参数的where子句,并且只选择top 10。您可以发布从sql profiler捕获的查询吗?嗨,好的,所以我创建了一个控制台应用程序,其中包含edmx文件,可以与存储的进程配合使用。当我使用edmx fil引用assemly时我甚至在另一个控制台应用程序中引用了有效的控制台应用程序…它死了。exec[dbo]。[spPartnerContacts]@startDate='2013-05-01 00:00:00',@endDate='2015-05-07 12:58:22',@companyPk=12我想可能是参数嗅探或过时的统计数据。