2017-06-16 32 views
1

私はEntity Framework 5を使用してSQL Server 2008に接続しています。問題なくストアドプロシージャをプロジェクトにインポートしました。ストアドプロシージャではOUTER APPLYを使用して固有の結果を得るために、LINQで.GroupBy().First()を使用して別の結果を得るまで、ストアドプロシージャは以前は問題なく実行されていました。EntityCommandExecutionExceptionタイムアウト期限切れ時々

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) 

代わりOUTER APPLYの私は2つのLEFT JOIN 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 
... 

ここでインポートクラスがエンティティでありますフレームワーク:

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()); 

不思議なストアドプロシージャは、すべてのヌルPARAMATERSで呼び出されたときに、タイムアウトにのみ発生(例えば、 db.PRODUCTS(null, null, null, null, null)

デフォルトの30秒ではなく、5分にタイムアウトを設定しようとしましたが、0分38秒38分15分全体で実行されています。

ストアドプロシージャは、すべてのデータ型をチェックして一致するので、このタイムアウトエラーが発生する理由はわかりません。時々だけ。

答えて

関連する問題