C# EntityCommandExecutionException超时仅在某些时候过期

C# EntityCommandExecutionException超时仅在某些时候过期,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我正在使用EntityFramework5连接到SQLServer2008。我已经将一个存储过程导入到我的项目中,没有任何问题。存储过程在过去执行时没有出现任何问题,直到我从在LINQ中使用.GroupBy().First()来获得不同的结果切换到在存储过程中使用外部应用来获得唯一的结果 我从LINQ中的.GroupBy()切换到在SQL Server上使用外部应用程序,因为SQL当然要快得多 以下是我的SQL: @USERID VARCHAR(MAX) = NULL, @ITEMTYPE VA

我正在使用EntityFramework5连接到SQLServer2008。我已经将一个存储过程导入到我的项目中,没有任何问题。存储过程在过去执行时没有出现任何问题,直到我从在LINQ中使用
.GroupBy().First()
来获得不同的结果切换到在存储过程中使用
外部应用来获得唯一的结果

我从LINQ中的
.GroupBy()
切换到在SQL Server上使用
外部应用程序
,因为SQL当然要快得多

以下是我的SQL:

@USERID VARCHAR(MAX) = NULL,
@ITEMTYPE VARCHAR(MAX) = NULL,
@ITEMSUBTYPE VARCHAR(MAX) = NULL,
@ITEMGROUP VARCHAR(MAX) = NULL,
@ITEMNO VARCHAR(MAX) = NULL    

SELECT distinct orderformdump.itemno, 
case when @userid = '' then NULL else CAST((SELECT top 1 [UNITPRICE] FROM [ICPRICP] WHERE [ITEMNO] = ICITEM.ITEMNO AND [PRICELIST] in (select priclist from ARCUS where IDCUST in (select CUSTID from WEBLOGINACCESS where [USER] = @USERID)) and [CURRENCY] = 'CDN' and DPRICETYPE = 1) AS DECIMAL(18,2)) end as price,
isnull(deals.isindeal, CAST(0 AS BIT) ) isindeal
FROM ORDERFORMDUMP
INNER JOIN ICITEM ON ICITEM.FMTITEMNO = orderformdump.itemno
outer apply
(
 select top 1 CAST(1 AS BIT) as isindeal
 from PRD2 INNER JOIN PRH on PRD2.CODE = PRH.CODE 
 where ICITEM.ITEMNO = PRD2.ITEMNO and PRH.ACTIVE = 1  
 and cast(GETDATE() as DATE) between PRH.STARTDATE and isnull(PRH.ENDDATE, cast(GETDATE() as DATE))
) deals
where
(@ITEMNO IS NULL or ICITEM.FMTITEMNO = @ITEMNO)
and
(@ITEMSUBTYPE is null or ORDERFORMITEMSUBTYPEDUMP.ITEMSUBTYPE = @ITEMSUBTYPE)
and
(@ITEMTYPE is null or ORDERFORMITEMTYPEDUMP.ITEMTYPE = @ITEMTYPE)
and
(@ITEMGROUP is null or ORDERFORMITEMGROUPDUMP.ITEMGROUP = @ITEMGROUP)
以前,我没有使用
外部应用
而是使用了两个
左连接
s,并且
isindeal
列位于
CASE
语句中:

...
case when PRH.ACTIVE = 1 and PRH.STARTDATE < cast(GETDATE() as DATE) and (PRH.ENDDATE IS NULL OR PRH.ENDDATE >= cast(GETDATE() as DATE)) then CAST(1 AS BIT) ELSE CAST(0 AS BIT) END as isindeal
...
LEFT JOIN PRD2 on ICITEM.ITEMNO = PRD2.ITEMNO
LEFT JOIN PRH on PRD2.CODE = PRH.CODE
...
这是它以前的名称:

db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno).GroupBy(i => i.itemno).Select(x => x.First());
奇怪的是,只有在使用所有null参数调用存储过程时才会发生超时(例如,
db.PRODUCTS(null,null,null,null,null)

我尝试将超时设置为5分钟,而不是默认的30秒,
((IObjectContextAdapter)this),但它只运行了整整5分钟,仍然超时

存储过程在SQL Server中3-5秒内完成执行,参数值为空,我已检查了所有数据类型,并且它们匹配,因此我不知道为什么有时会出现此超时错误。

简短回答:将选项(重新编译)添加到此查询

长答案:阅读Erland Sommarskog的

db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno)
db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno).GroupBy(i => i.itemno).Select(x => x.First());