«Одновременная» вставка, если она отсутствует, и запись в журнале с использованием Linq - PullRequest
0 голосов
/ 14 октября 2011

При расчете времени выполнения нашего кода я заметил, что при каждом взаимодействии Linq с SQL Server требуется значительное время транзакции.В прошлом, когда мы использовали SQL напрямую, мы могли размещать несколько операторов и отправлять их одновременно.Есть ли способ сделать это в Linq?В частности, у меня есть две таблицы: таблица журнала и таблица UHA (userhostaddress).Если uha еще нет в таблице UHA, его необходимо вставить, а затем запись в журнале, сделанную с помощью uhaid.В Linq для этого требуется три вызова: один для проверки того, что UHA не существует, один раз для его вставки и один раз для журнала.Могу ли я сделать это за один звонок в базу данных?

    var uha = db.UHAs.Where(u => u.userhostaddress == _userHostAddress).FirstOrDefault();
    if (uha == null)
    {
        var newUha = new UHA()
        {
            userhostaddress = _userHostAddress
        };
        db.UHAs.InsertOnSubmit(newUha);
        db.SubmitChanges();     // 2. Second call

        uha = newUha;
    }

    SHA1 sha1 = SHA1.Create();
    var newLog= new Log()
    {                    
        requested = DateTime.UtcNow,
        uhaid = uha.uhaid,
        query = _query,
        queryhash = sha1.ComputeHash(Encoding.UTF8.GetBytes(_query))
    };
    db.Log.InsertOnSubmit(newLog);
    db.SubmitChanges();

1 Ответ

0 голосов
/ 14 октября 2011

Поскольку вы используете один и тот же экземпляр контекста данных, вам нужно вызывать метод SubmitChanges () только один раз. Это будет выполнять все команды одновременно, а не совершать многократные поездки на сервер sql.

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