C# SQL While循环还是c linq foreach?

C# SQL While循环还是c linq foreach?,c#,sql-server,linq,C#,Sql Server,Linq,我有一个用SQL编写的信用卡支付过程存储过程。这是在使用SQL的同时循环50万条付款记录。这太慢了,因为我必须为每个付款记录循环另一组数据,并相应地更新一组表。这意味着sql中的while循环中包含while循环 为了提高性能,我必须用c语言重新编写。我们正在使用LINQ和实体框架。有人能告诉我这是否有用吗 谢谢 使用修改后的存储过程更新我的问题。我已经替换了对我的表的引用,并删除了部分代码。但如果不清楚,请告诉我 CREATE PROCEDURE [dbo].[USP_ProcessPayme

我有一个用SQL编写的信用卡支付过程存储过程。这是在使用SQL的同时循环50万条付款记录。这太慢了,因为我必须为每个付款记录循环另一组数据,并相应地更新一组表。这意味着sql中的while循环中包含while循环

为了提高性能,我必须用c语言重新编写。我们正在使用LINQ和实体框架。有人能告诉我这是否有用吗

谢谢

使用修改后的存储过程更新我的问题。我已经替换了对我的表的引用,并删除了部分代码。但如果不清楚,请告诉我

CREATE PROCEDURE [dbo].[USP_ProcessPayments]
(
      @UserKey int
)

AS
BEGIN

SET NOCOUNT ON;

CREATE TABLE #TempUserPayments
(
      -- with Columns declared
)


INSERT INTO #TempUserPayments 
SELECT DISTINCT up.*, ROW_NUMBER() OVER(ORDER BY up.UserKey DESC, up.DateReceived) AS RN  --generate row number
FROM  UserPayment up 
where up.UserKey = @UserKey

CREATE INDEX UP_1 on #TempUserPayments (RN);

        DECLARE @LOOPCOUNTER INT, @ROWCOUNTER INT, @REQUESTEDAMOUNT MONEY, @UPDATEDREQUESTEDAMOUNT MONEY, @AMOUNT MONEY, 
                @AMOUNTNOTAPPLIED MONEY, @APPLIEDAMOUNT MONEY, @SYSTEMKEY INT, @LOOPCOUNTER_PR INT, @ROWCOUNTER_PR INT, @IS_UPDATE BIT


        SELECT @ROWCOUNTER = COUNT(*) from #TempUserPayments;
        SET @LOOPCOUNTER = 1
        WHILE (@LOOPCOUNTER <= @ROWCOUNTER)
        BEGIN
                    SELECT *,
                    ROW_NUMBER() OVER (ORDER BY mp.Month DESC, mp.PayPriority) AS RN_PR
                    INTO #TempPR
                    FROM Requests pr
                    INNER JOIN Premium mp ON mp.PremiumKey = pr.PremiumKey
                    --Joing couple of other tables here
                    ORDER BY mp.[Month] DESC, mp.PayPriority  

                    CREATE INDEX PR_1 on #TempPR (RN_PR);


                    SELECT @SYSTEMKEY =  SystemKey FROM #TempUserPayments WHERE RN = @LOOPCOUNTER;
                    SELECT @ROWCOUNTER_PR = COUNT(*) from #TempPR;
                    SET @LOOPCOUNTER_PR = 1


                    WHILE (@LOOPCOUNTER_PR <= @ROWCOUNTER_PR)
                    BEGIN
                              SET @IS_UPDATE = 0;                                 

                              IF(@APPLIEDAMOUNT IS NULL OR (@REQUESTEDAMOUNT <> @APPLIEDAMOUNT AND @APPLIEDAMOUNT < @REQUESTEDAMOUNT))
                              BEGIN 

                                    IF(@SYSTEMKEY = 1 OR @SYSTEMKEY = 3)
                                    BEGIN
                                        --Check all the conditions here
                                        SET @IS_UPDATE = 1;
                                    END


                                    IF(@IS_UPDATE = 1)
                                    BEGIN

                                                --Update bunch of requets tables ---

                                                INSERT INTO userpaid
                                                (
                                                  --Column names --
                                                )
                                                VALUES 
                                                (
                                                    --Values --
                                                )
                                    END 
                              END
                    --     END
                          SET @LOOPCOUNTER_PR = @LOOPCOUNTER_PR + 1;

                 END

              SET @LOOPCOUNTER = @LOOPCOUNTER + 1;
              DROP TABLE #TempPR;

        END  

              DROP TABLE #TempUserPayments;

结束

只是一个观点:对linq做同样的事情可能是最糟糕的,因为它至少增加了网络I/O。相反,我会在这里发布该过程,并询问如何通过折磨行来删除RBAR方法行。值得怀疑的是,您所做的只是添加IO时间以从数据库获取数据,然后更新数据。您确定没有基于集合的方法来处理数据吗?如果你能想出一种不在sqlI中循环的方法,那么处理速度会更快。我必须对多个请求应用这些支付。您必须不断更新这些付款中未应用的金额,并查看是否还有剩余金额和剩余请求等…这似乎是一个连续的总数。哪个SQL Server版本?只是一个观点:对linq做同样的事情可能是最糟糕的,因为它至少增加了网络I/O。相反,我会在这里发布该过程,并询问如何通过折磨行来删除RBAR方法行。值得怀疑的是,您所做的只是添加IO时间以从数据库获取数据,然后更新数据。您确定没有基于集合的方法来处理数据吗?如果你能想出一种不在sqlI中循环的方法,那么处理速度会更快。我必须对多个请求应用这些支付。您必须不断更新这些付款中未应用的金额,并查看是否还有剩余金额和剩余请求等…这似乎是一个连续的总数。哪个SQL Server版本?