实体框架存储过程调用超时

时间:2018-02-23 18:47:29

标签: c# sql entity-framework-6

这是一个奇怪的..

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

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存储过程调用会花费多长时间,它会执行完全相同的查询。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

表格一定被锁定了吗?

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

我没有对表添加锁定并且它有效,奇怪,因为它在遗留版本的网站中有效...必须与实体框架有关