Выполнить условное массовое обновление в Linq to SQL - PullRequest
3 голосов
/ 25 января 2010

У меня есть таблица SQL, в которой хранятся фотографии с полем smallint SortOrder. Пользователи могут вставлять новые фотографии, указав порядок сортировки в десятичном формате, чтобы разместить новую запись между двумя существующими фотографиями (или перед первой фотографией). SortOrder будет сохранен как smallint, поэтому, когда я обнаружу, что вставка сместит существующие записи, мне нужно обновить все затронутые фотографии, чтобы увеличить SortOrder на 1.

Это легко сделать в хранимой процедуре, но я ищу наиболее эффективный способ сделать это с помощью Linq to SQL. Если мне нужно будет передать все записи клиенту, обновить их, а затем отправить их, я просто буду придерживаться хранимой процедуры, которая уже работает и работает очень быстро.

Вот T-SQL, который сдвигает записи:

    UPDATE      Photo
    SET         SortOrder = SortOrder + 1
    WHERE       AlbumId = @AlbumId
    AND         SortOrder >= CEILING(@SortOrder)

Есть ли способ выполнить такое массовое обновление в Linq для SQL без необходимости извлечения записей?

Ответы [ 4 ]

6 голосов
/ 25 января 2010

LINQ to SQL не делает операторов CUD для множеств, поэтому придерживайтесь существующей реализации, так как это будет лучшим в вашем сценарии.

3 голосов
/ 25 января 2010

У меня был большой успех в этой работе: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

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

1 голос
/ 25 января 2010

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

Является ли sproc тем, за что клиент отвечает за вызов при нажатии на новую фотографию? Вместо этого вам лучше установить его в качестве триггера, чтобы ваше приложение не несло прямой ответственности за дополнительный (легко забываемый) шаг. Это компромисс в сложности, конечно, и вопрос предпочтения.

0 голосов
/ 25 января 2010

Один из вариантов - построить строку sql, которая была в хранимой процедуре, и выполнить ее с помощью метода DataContext.ExecuteQuery.Выполнение этого таким образом предотвратит выборку записей.

...