Преимущества LINQ? - PullRequest
       3

Преимущества LINQ?

0 голосов
/ 22 августа 2011

Я слишком долго беспокоился об этой проблеме, однако, поскольку у меня не было никаких окончательных ответов, я попытаюсь изложить ситуацию еще раз, более четко.

У меня есть вопросник, который позволяетадминистраторы могут добавлять разные категории и разные вопросы для каждой категории, поэтому на вставках для каждой категории я не могу жестко задавать параметры, поскольку не знаю, на сколько вопросов ответит пользователь.

Сейчас у меня есть 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 в этом сценарии может улучшить производительность - но я не могу получить ответ.

Возможно, у меня нет знаний, но я пытаюсь научитьсяпрограммировать элегантно, и ваша помощь будет очень признательна!

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

Я предполагаю, что приложение является веб-приложением asp.net.

В этом сценарии asp.net будет использовать пул соединений, так что, в то время как вы можете открывать и закрывать многие соединения в своем коде, в действительности .NET использует только заданное количество соединений и повторно использует их как Вы нуждаетесь в них.

Если цель состоит в том, чтобы уменьшить нагрузку на сервер SQL, я бы порекомендовал что-то вроде веб-службы, которая собирает ответы по мере их поступления, а затем передает их на сервер SQL вместо того, чтобы отправлять каждый отдельный запрос непосредственно из сам сайт.

0 голосов
/ 22 августа 2011

Если вы говорите о 100 людях (а не о веб-сайте с миллионами пользователей), я думаю, вы в порядке.Не выполняйте преждевременную оптимизацию, если только вы не видите, как страдает ваш экземпляр SQL Server.

Как говорит @Jroc, SQL Server повторно использует один и тот же пул соединений, поэтому вам не нужно беспокоиться об открытии и закрытии соединения.,SQL Server предназначен для этого, и на самом деле лучше закрыть ваше соединение, как только вы закончите с ним, чем рисковать, оставляя соединения открытыми где-то.

Что касается LINQ, он не дает вам никакой производительности.преимущество в этом сценарии (на самом деле, для вставок и обновлений LINQ to SQL, как правило, делает именно то, что вы делаете, и выдает одну вставку / обновление на строку)

И последнее, что нужно сделать с вашей хранимой процедурой: если выв SQL 2008 вы можете захотеть взглянуть на команду MERGE , которая объединяет вашу логику «проверить, существует ли строка, если да, обновить, если не вставить» в одной отдельной команде, и может улучшить производительность (и удобочитаемость)

0 голосов
/ 22 августа 2011

Вам действительно не нужно повторно создавать объект соединения внутри цикла foreach, вы можете повторно использовать существующее соединение для всех строк.

Что касается последствий переподключения, то его практически нет, поскольку ADO.Net использует пул соединений, что означает, что при отключении от БД подсистема ADO сохраняет соединение открытым для последующего повторного использования другим возможным объектом соединения.

Что касается LINQ, он используется для запроса запрашиваемых объектов, а не для обновления, как в вашем случае использования.

0 голосов
/ 22 августа 2011

Ответ - это зависит.

Будет быстрее, если вы вставите / обновите несколько вопросов за одну операцию (либо с помощью linq, либо с сохраненным процессом).Однако вам может потребоваться обновить его для каждого вопроса, поэтому, если пользователь отключен, он не потеряет свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...