Benefits of LINQ?

本文关键字:LINQ of Benefits | 更新日期: 2023-09-27 18:06:31

我已经为这个问题烦恼太久了,但是由于我没有任何明确的答案,我将尝试以更清晰的方式再次说明情况。

我有一个问卷,它允许管理员为每个类别添加不同的类别和不同的问题,因此在每个类别的插入上,我无法硬编码参数,因为我不知道用户将回答多少问题。

现在我有一个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

then在c#中我循环遍历所有的问题;

foreach (GridViewRow gvr in GridView1.Rows)
    {
        var rb = gvr.FindControl("answerswers_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();
        }
    }

我问过我自己的服务器团队,如果打开和关闭DB这么多次是糟糕的编码(有时可能有超过100人同时回答100多个问题),但我无法得到答案。我在这里问是否有更有效的解决方案,或者在这种情况下使用LINQ是否可以提高性能-但我无法得到答案。

我可能没有知识,但我正在努力学习优雅地编程,您的帮助将是最感激的!

Benefits of LINQ?

我假设应用程序是基于web的asp.net之一。

在这种情况下,asp.net将使用连接池,因此当你可能在代码中打开和关闭许多连接时,实际上,.net只使用一定数量的连接,并在需要时重用这些连接。

如果目标是减少SQL服务器的负载,我会推荐类似Web Service的东西,它收集响应,因为他们进来,然后将它们批量发送到SQL服务器,而不是直接从网站本身发布每个单独的响应。

答案是视情况而定。

如果您在一次操作中插入/更新多个问题(使用linq或使用存储过程)将会更快。然而,你可能需要为每个问题更新它,这样如果用户断开连接,他们就不会失去他们的工作。

您确实不需要在foreach循环中重新创建连接对象,您可以为所有行重用现有的连接。

对于重新连接的影响,实际上没有,因为ADO。Net使用连接池,这意味着当您从DB断开连接时,ADO子系统将保持连接打开,以便将来由另一个可能的连接对象重用。

对于LINQ,它用于查询可查询的对象,而不是像您的用例那样用于更新。

如果你谈论的是100个人(而不是一个拥有数百万用户的网站),我认为你很好。不要做过早的优化,除非你看到你的SQL Server实例出现问题。

正如@Jroc所说,SQL Server重用相同的连接池,所以你不必担心打开和关闭连接。SQL Server就是这样设计的,当你用完连接后,最好马上关闭它,而不是冒着让连接打开的风险。

对于LINQ,在这种情况下它不会给你任何性能优势(实际上,对于插入和更新,LINQ to SQL倾向于做你正在做的事情,并发出每一行插入/更新)

关于存储过程的最后一件事:如果您使用的是SQL 2008,您可能想看看MERGE命令,它将您的逻辑组合为"检查行是否存在,如果存在则更新,如果不存在则插入"在一个命令中,并且可能提高性能(和可读性)