首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityCommandExecutionException超时仅在有时过期

EntityCommandExecutionException超时仅在有时过期
EN

Stack Overflow用户
提问于 2017-06-16 16:28:02
回答 1查看 926关注 0票数 1

我使用实体框架5连接到Server 2008。我将一个存储过程导入到我的项目中,没有任何问题。存储过程在过去一直执行,没有任何问题,直到我从使用LINQ中的.GroupBy().First()获得不同的结果,切换到使用存储过程中的OUTER APPLY获得唯一的结果。

我从LINQ中的OUTER APPLY切换到在Server上使用.GroupBy(),因为当然SQL要快得多。

以下是我的SQL:

代码语言:javascript
复制
@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)

以前,我没有使用OUTER APPLY,而是有两个LEFT JOINisindeal列在CASE语句中:

代码语言:javascript
复制
...
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
...

以下是实体框架中导入的类:

代码语言:javascript
复制
public partial class PRODUCTS_Result
{
    public string itemno { get; set; }
    public Nullable<decimal> price { get; set; }
    public bool isindeal { get; set; }
}

存储过程是这样调用的:

代码语言:javascript
复制
db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno)

以前是这样叫它的:

代码语言:javascript
复制
db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno).GroupBy(i => i.itemno).Select(x => x.First());

奇怪的是,只有在使用所有空参数调用存储过程时才会发生超时(例如。db.PRODUCTS(null, null, null, null, null))

我尝试将超时设置为5分钟,而不是默认的30秒,((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;,但它只运行了整个5分钟,并且仍然超时。

存储过程在3-5秒内完成执行,参数的所有NULL值都是空值,我检查了所有数据类型并将它们匹配起来,所以我不知道为什么有时会出现这个超时错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 17:01:12

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

长篇大论:阅读Erland的TSQL中的动态搜索条件

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

https://stackoverflow.com/questions/44593941

复制
相关文章

相似问题

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