簡體   English   中英

LINQ的好處?

[英]Benefits of LINQ?

我一直在為這個問題煩惱不已,但是由於我沒有得到任何明確的答案,我將以更清晰的方式再次說明情況。

我有一個問卷,允許管理員為每個類別添加不同的類別和不同的問題,因此對於每個類別的插入我不能硬編碼參數,因為我不知道用戶將回答多少問題。

現在我有一個插入(或更新)一行的SP;

CREATE PROCEDURE [dbo].[insertResults]
    @userId nvarchar(10),
    @groupId INT ,
    @questionId INT,
    @answer INT 
AS
BEGIN 

SELECT *  FROM answers 
     WHERE   userId = @userId AND questionId = @questionId 
IF @@ROWCOUNT=0

INSERT  INTO answers
        (   userId,
    groupId,
    questionId,
    answer
        )
VALUES  ( 
        @userId,
    @groupId ,
    @questionId,
    @answer
        )
ELSE

UPDATE answers
SET answer = @answer
WHERE   userId = @userId AND questionId = @questionId 
END

然后在C#中循環遍歷所有問題;

foreach (GridViewRow gvr in GridView1.Rows)
    {
        var rb = gvr.FindControl("answers_list") as RadioButtonList;
        var quest = rb.SelectedValue;

        if (quest == "")
        {
            quest = "0";
        }

        int questionId = Convert.ToInt32(GridView1.DataKeys[gvr.RowIndex].Values[0].ToString());
        int groupId = Convert.ToInt32(GridView1.DataKeys[gvr.RowIndex].Values[1].ToString());
        int question = Convert.ToInt32(quest);
        var objDB01 = new dbconn();
        const string strSQL = "insertResults";
        objDB01.objCommand.Parameters.AddWithValue("@userId", logonName);
        objDB01.objCommand.Parameters.AddWithValue("@groupId", groupId);
        objDB01.objCommand.Parameters.AddWithValue("@questionId", questionId);
        objDB01.objCommand.Parameters.AddWithValue("@answer", question);
        try
        {
            objDB01.GetNonQuery(strSQL);
        }
        finally
        {
            objDB01.Dispose();
        }
    }

我問過我自己的服務器團隊是否打開和關閉數據庫這么多次是編碼不好(有時可能有超過100人同時回答100多個問題)但我無法得到答案。 我在這里問過是否有更有效的解決方案,或者在這種情況下使用LINQ可以提高性能 - 但我無法得到答案。

我可能沒有這方面的知識,但我正在努力學習優雅的程序,你的幫助將非常感激!

我假設該應用程序是基於Web的asp.net。

在這種情況下,asp.net將使用連接池,因此當您可能在代碼中打開和關閉許多連接時,實際上,.NET只使用一定數量的連接,並在您需要時重新使用它們。

如果目的是減少SQL服務器上的負載,我建議像Web服務那樣收集響應,然后將它們批處理到SQL服務器,而不是直接從網站本身發布每個單獨的服務。 。

答案取決於它。

如果在一個操作中插入/更新多個問題(使用linq或使用存儲過程),它會更快。 但是,您可能需要針對每個問題更新它,因此如果用戶斷開連接,他們就不會丟失工作。

您真的不需要在foreach循環中重新創建連接對象,您可以重用所有行的現有連接。

至於重新連接的影響實際上沒有,因為ADO.Net使用連接池,這意味着當您從DB斷開連接時,ADO子系統保持連接打開,以便將來重用另一個可能的連接對象。

對於LINQ,它用於查詢可查詢對象,而不是像在用例中那樣進行更新。

如果你說的是100人(而不是一個擁有數百萬用戶的網站),我認為你很好。 除非您看到您的SQL Server實例受到影響,否則不要進行過早優化。

正如@Jroc所說,SQL Server重用了相同的連接池,因此您不必擔心打開和關閉連接。 SQL Server旨在實現這一目標,實際上,一旦完成連接就關閉連接,而不是冒險將連接打開。

對於LINQ,它在這種情況下沒有給你任何性能優勢(實際上,對於插入和更新,LINQ to SQL傾向於完成你正在做的事情並且每行發出一次插入/更新)

關於存儲過程的最后一件事:如果您使用的是SQL 2008,您可能需要查看MERGE命令 ,該命令將您的邏輯組合在一起“檢查是否存在行,如果是,則更新,如果不是,則插入”命令, 可能會提高性能 (和可讀性)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM