【问题标题】:EntityCommandExecutionException Timeout Expired Only SometimesEntityCommandExecutionException 超时仅在某些时候过期
【发布时间】:2017-06-17 01:01:12
【问题描述】:

我正在使用 Entity Framework 5 连接到 SQL Server 2008。我已将存储过程导入到我的项目中,没有任何问题。存储过程在过去执行时完全没有问题,直到我从在 LINQ 中使用 .GroupBy().First() 获得不同的结果转换为通过在存储过程中使用 OUTER APPLY 获得独特的结果。

我从 LINQ 中的 .GroupBy() 切换到在 SQL Server 上使用 OUTER APPLY,因为当然 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)

之前,我有两个 LEFT JOINs 而不是 OUTER APPLY,而 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
...

这是 Entity Framework 中导入的类:

public partial class PRODUCTS_Result
{
    public string itemno { get; set; }
    public Nullable<decimal> price { get; set; }
    public bool isindeal { get; set; }
}

这是存储过程的调用方式:

db.PRODUCTS(userid, itemtype, itemsubtype, itemgroup, itemno)

这是它之前的调用方式:

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 秒内完成 SQL Server 中的执行,参数全部为 NULL,我检查了所有数据类型并且它们匹配,所以我不知道为什么我只收到这个超时错误有时。

【问题讨论】:

    标签: c# sql-server entity-framework linq


    【解决方案1】:

    简答:向此查询添加 OPTION (RECOMPILE)

    长答案:阅读 Erland Sommarskog 的 Dynamic Search Conditions in TSQL

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2015-10-04
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多