【问题标题】:Entity framework stored procedure call timeout实体框架存储过程调用超时
【发布时间】:2018-02-23 18:47:28
【问题描述】:

这是一个奇怪的..

我的数据库中有一个存储过程,如下所示:

SET NOCOUNT ON;
    WITH CTE AS(

        --FC
        SELECT transno, RECHASEON,
            convert(varchar(12),orderdate, 101) as orderdate,
            convert(varchar(12),duedate, 101) as duedate,
            m.clientid+'-'+l.name as clientname,
            (SELECT TOP 1c.Comments FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) as MostRecentComment,
            'FC' as PortalType,
            (SELECT COUNT(*) FROM dbo.qcComments c WHERE m.transno = c.transno) AS NumTimesKickedBack,
             m.SubRep,
             m.ClientID,
            (SELECT convert(varchar(12),MAX(c.Comment_Date), 101) FROM dbo.qcComments c WHERE m.transno = c.transno) as MostRecentReturnDate,
            (SELECT TOP 1 c.UserID FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) AS LastUserKickBack

        FROM dbo.maindata m (NOLOCK)
        inner join bluscreen.dbo.Lender L (NOLOCK) on L.clientid = M.clientid

        where m.cid = @CID  
        and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
        and m.RCD=''    -- open assignment
        and exists (    -- qc kickback comments exist for the transno
            select transno 
            from dbo.qcComments c 
            where c.TransNo = m.TransNo)

        UNION

        --RPI
        SELECT  m.TransNo,
                m.RechaseON,
                convert(varchar(12),m.OrderDate, 101),
                convert(varchar(12),m.DueDate, 101),
                m.clientid+'-'+l.name as clientname,
                (SELECT TOP 1 c.message FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS MostRecentComment,
                'RPI' as PortalType,
                (SELECT COUNT(*) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as NumTimesKickedBack,
                m.SubRep,
                m.ClientID,
                (SELECT convert(varchar(12),MAX(c.datetime), 101) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as MostRecentReturnDate,
                (SELECT TOP 1 c.username FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS LastUserKickBack

        FROM webdata.dbo.MainData m
        INNER JOIN  rpi.dbo.Requests r on m.TransNo=r.transno
        INNER JOIN bluscreen.dbo.Lender l on l.clientid = m.clientid
        INNER JOIN rpi.dbo.msgbrd msg on m.TransNo=msg.transno and msgtype='QC' --This join is used to check where a TransNo has been kicked back
        where m.RCD=''          --open
        AND r.qcpending='ON'    --qc kickback
        AND m.CID = @CID 
        and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))

        UNION 

        --LM
        select  m.TransNo,
                m.RechaseON,
                convert(varchar(12), m.OrderDate, 101),
                convert(varchar(12),m .DueDate, 101),
                m.clientid+'-'+l.name as clientname,
                (SELECT TOP 1 c.NOTES FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as MostRecentComment,
                'LM' as PortalType,
                (SELECT COUNT(*) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as NumTimesKickedBack,
                m.SubRep,
                m.ClientID,
                (SELECT convert(varchar(12),MAX(c.DATETIME_ENTRY), 101) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as MostRecentReturnDate,
                (SELECT TOP 1 c.USERID FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as LastUserKickback

        from webdata.dbo.MainData m
        INNER JOIN lossmitigation.dbo.Requests r on m.TransNo=r.TRANSNO
        INNER JOIN lossmitigation.dbo.Translog_Call t on m.TransNo=t.TRANSNO and t.CALL_RESULT_CODE='DIS' --This join is used to check where a TransNo has been kicked back
        INNER JOIN bluscreen.dbo.Lender l on l.clientid = m.clientid
        where r.Status='PENDING' --open assignment
        AND m.CID = @CID 
        and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
    )

    SELECT * FROM cte
    ORDER BY
            CASE
                WHEN @SortBy = 'Rechase' THEN RechaseON     
            END DESC,

            CASE
                WHEN @SortBy = 'NumKickbacks' THEN NumTimesKickedBack   
            END DESC,

            CASE 
                WHEN @SortBy = 'TransNo' THEN TransNo
                WHEN @SortBy = 'ClientID' THEN ClientName
                WHEN @SortBy = 'Subrep' THEN Subrep 
                WHEN @SortBy = 'LastKickbackUser' THEN LastUserKickBack

            END DESC,

            CASE 
                WHEN @SortBy = 'OrderDate' THEN OrderDate
                WHEN @SortBy = 'DueDate' THEN DueDate
                WHEN @SortBy = 'ReturnDate' THEN MostRecentReturnDate   
                ELSE TransNo    
            END ASC

在我的代码中,我使用如下所示的实体框架调用存储过程:

using webDataDBContext = new WebDataEntities() {
var data = webDataDBContext.view_inqc_manifest_cid_II("11R", "REP", "rpfield", "TransNo").ToList()
}

如果我在服务器上运行存储过程,它会在不到一秒的时间内执行。它运行这个查询:

 EXEC [dbo].[view_inqc_manifest_cid_II] '11R', 'REP', 'rpField', 'TransNo'

但是 .NET 中的等效项运行时间超过 100 秒(我取消了查询,因为运行时间太长)。我完全不知道为什么 .NET 存储过程调用需要这么长时间,它执行完全相同的查询。

有人知道为什么会这样吗?

【问题讨论】:

    标签: c# sql entity-framework-6


    【解决方案1】:

    表一定被锁定了?

    SET NOCOUNT ON;
            WITH CTE AS(
    
                --FC
                SELECT transno, RECHASEON,
                    convert(varchar(12),orderdate, 101) as orderdate,
                    convert(varchar(12),duedate, 101) as duedate,
                    m.clientid+'-'+l.name as clientname,
                    (SELECT TOP 1c.Comments FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) as MostRecentComment,
                    'FC' as PortalType,
                    (SELECT COUNT(*) FROM dbo.qcComments c WHERE m.transno = c.transno) AS NumTimesKickedBack,
                     m.SubRep,
                     m.ClientID,
                    (SELECT convert(varchar(12),MAX(c.Comment_Date), 101) FROM dbo.qcComments c WHERE m.transno = c.transno) as MostRecentReturnDate,
                    (SELECT TOP 1 c.UserID FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) AS LastUserKickBack
    
                FROM dbo.maindata m (NOLOCK)
                inner join bluscreen.dbo.Lender L (NOLOCK) on L.clientid = M.clientid
    
                where m.cid = @CID  
                and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
                and m.RCD=''    -- open assignment
                and exists (    -- qc kickback comments exist for the transno
                    select transno 
                    from dbo.qcComments c 
                    where c.TransNo = m.TransNo)
    
                UNION
    
                --RPI
                SELECT  m.TransNo,
                        m.RechaseON,
                        convert(varchar(12),m.OrderDate, 101),
                        convert(varchar(12),m.DueDate, 101),
                        m.clientid+'-'+l.name as clientname,
                        (SELECT TOP 1 c.message FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS MostRecentComment,
                        'RPI' as PortalType,
                        (SELECT COUNT(*) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as NumTimesKickedBack,
                        m.SubRep,
                        m.ClientID,
                        (SELECT convert(varchar(12),MAX(c.datetime), 101) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as MostRecentReturnDate,
                        (SELECT TOP 1 c.username FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS LastUserKickBack
    
                FROM webdata.dbo.MainData m (NOLOCK)
                INNER JOIN  rpi.dbo.Requests r (NOLOCK) on m.TransNo=r.transno
                INNER JOIN bluscreen.dbo.Lender l (NOLOCK) on l.clientid = m.clientid
                INNER JOIN rpi.dbo.msgbrd msg (NOLOCK) on m.TransNo=msg.transno and msgtype='QC' --This join is used to check where a TransNo has been kicked back
                where m.RCD=''          --open
                AND r.qcpending='ON'    --qc kickback
                AND m.CID = @CID 
                and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
    
                UNION 
    
                --LM
                select  m.TransNo,
                        m.RechaseON,
                        convert(varchar(12), m.OrderDate, 101),
                        convert(varchar(12),m .DueDate, 101),
                        m.clientid+'-'+l.name as clientname,
                        (SELECT TOP 1 c.NOTES FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as MostRecentComment,
                        'LM' as PortalType,
                        (SELECT COUNT(*) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as NumTimesKickedBack,
                        m.SubRep,
                        m.ClientID,
                        (SELECT convert(varchar(12),MAX(c.DATETIME_ENTRY), 101) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as MostRecentReturnDate,
                        (SELECT TOP 1 c.USERID FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as LastUserKickback
    
                from webdata.dbo.MainData m (NOLOCK)
                INNER JOIN lossmitigation.dbo.Requests r (NOLOCK) on m.TransNo=r.TRANSNO
                INNER JOIN lossmitigation.dbo.Translog_Call t (NOLOCK) on m.TransNo=t.TRANSNO and t.CALL_RESULT_CODE='DIS' --This join is used to check where a TransNo has been kicked back
                INNER JOIN bluscreen.dbo.Lender l (NOLOCK) on l.clientid = m.clientid
                where r.Status='PENDING' --open assignment
                AND m.CID = @CID 
                and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
            )
    
            SELECT * FROM cte
            ORDER BY
                    CASE
                        WHEN @SortBy = 'Rechase' THEN RechaseON     
                    END DESC,
    
                    CASE
                        WHEN @SortBy = 'NumKickbacks' THEN NumTimesKickedBack   
                    END DESC,
    
                    CASE 
                        WHEN @SortBy = 'TransNo' THEN TransNo
                        WHEN @SortBy = 'ClientID' THEN ClientName
                        WHEN @SortBy = 'Subrep' THEN Subrep 
                        WHEN @SortBy = 'LastKickbackUser' THEN LastUserKickBack
    
                    END DESC,
    
                    CASE 
                        WHEN @SortBy = 'OrderDate' THEN OrderDate
                        WHEN @SortBy = 'DueDate' THEN DueDate
                        WHEN @SortBy = 'ReturnDate' THEN MostRecentReturnDate   
                        ELSE TransNo    
                    END ASC
    

    我没有给表格加锁,它工作了,奇怪的是它在网站的旧版本中工作......一定与实体框架有关

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多