Как найти количество строк, затронутых в LINQ to SQL? - PullRequest
1 голос
/ 14 сентября 2009

Кто-нибудь знает, как найти количество затронутых строк ПОСЛЕ того, как я отправил изменения в контекст данных в LINQ to SQL?

Сначала я делал что-то вроде этого:

Using db as New MyDataContext()
    db.Users.Attach(modifiedUser, True)
    db.SubmitChanges()

    Dim rowsUpdated As Integer = db.GetChangeSet().Updates.Count
End Using

С тех пор я понял, что это не работает и что

db.GetChangeSet().Updates.Count

Только сообщает вам, сколько будет обновлений ДО того, как вы вызовете SubmitChanges ().

Есть ли способ узнать, сколько строк действительно было затронуто?

Ответы [ 5 ]

4 голосов
/ 14 сентября 2009

L2S выдает отдельные операторы вставки / обновления / удаления для каждой затронутой строки, поэтому при подсчете сущностей в результатах GetChangeSet будет получено правильное число «затронутых строк» ​​*.

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

(* = ... с одним исключением; если у вас есть обновляемые представления с триггерами вместо триггеров, у вас может возникнуть ситуация, когда вместо триггера будет выполнено несколько базовых строк для каждой обновленной строки. немного крайний случай ... :))

0 голосов
/ 22 февраля 2019

Позвоните в следующей последовательности, вы получите счет

Dim linesUpdated As Integer = db.GetChangeSet (). Updates.Count

db.SubmitChanges ();

0 голосов
/ 01 мая 2015

Добавьте этот метод расширения в приложение:

  /// <summary>
    /// Saves all chanches made in this context to the underlying database.
    /// </summary>
    /// <returns></returns>
    /// <exception cref="System.InvalidOperationException">
    /// </exception>
    public static int SaveChanges(this System.Data.Linq.DataContext context)
    {
        try
        {
            int count1 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count;
            context.SubmitChanges();
            int count2 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count;
            return count1 - count2;
        }
        catch (Exception e)
        {
            throw new InvalidOperationException(e.Message);
        }
    }
0 голосов
/ 14 сентября 2009

Поскольку потенциально может быть совершено несколько различных операций, маловероятно, что вы сможете получить такую ​​информацию.

Команда SubmitChanges () будет фиксировать вставки, обновления и удаления, и, насколько я могу судить, нет способа получить количество затронутых строк для каждого (# строк удалено / обновлено / вставлено и т. Д.). Все, что вы можете сделать, это посмотреть, что будет совершено, как вы уже обнаружили.

Если у вас была, в частности, одна операция, которую вы хотели выполнить, вы могли бы использовать метод ExecuteCommand (), который возвращает количество затронутых строк.

0 голосов
/ 14 сентября 2009

Я не работал над LINQ to SQL. Но я думаю, что это может быть невозможно.

Причина, которая приходит на ум, заключается в следующем: вы можете обновить несколько объектов до вызова SubmitChanges. Итак, какие "затронутые записи", которые вы ищете, не будут известны, я думаю.

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