linq to sql обновить несколько записей - PullRequest
1 голос
/ 02 ноября 2011

Вроде бы простая проблема, но я совершенно заблудился, как к этому подойти.

CREATE TABLE Contract (
  id int PRIMARY KEY,
  batchId int NOT NULL REFERENCES ContractBatch (id)
  campaignId int NULL REFERENCES Campaign (id)
)

Это упрощенная таблица в моей бизнес-модели, созданная для модели Linq2Sql. Теперь мне нужно сделать запрос на обновление следующим образом:

UPDATE Contract SET campaignId = 1 WHERE batchId = 5

Это означает, что может быть больше записей для одного и того же ContractBatch, и мне нужно установить Campaign для всех них. Можно ли каким-то простым способом преобразовать этот запрос в выражение Linq? Единственный способ, которым я могу найти, - это извлечь все эти записи для этого ContractBatch и затем обновить одну за другой в цикле. Это не очень эффективно.

var campaignId = 1;
var batchId = 5;
using( var dataContext = new DataModel.ModelDataContext() ) {
    dataContext.Contracts
        .Where( c => c.BatchId == batchId )
        // this is obviously my "wish to have" method
        .ForEach( c => c.CampaignId = campaignId )
    dataContext.SubmitChanges()
}

Я уже думаю о том, чтобы сделать это по-старому 1014 * и выполнить этот запрос вручную. Мне это не нравится, но это, вероятно, лучше, чем запускать сотни запросов на обновление.

Ответы [ 2 ]

5 голосов
/ 02 ноября 2011

Вы правы в том, что с этим подходом есть две проблемы - вы будете выполнять сотни отдельных операторов обновления, и вы должны сначала прочитать их, чтобы внести изменения.

Это общая слабость в ОРМ.

Перейдя по нескольким ссылкам в Google, я обнаружил следующее сообщение в блоге, в котором есть что сказать в этой области: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

1 голос
/ 02 ноября 2011

Вы можете использовать хранимую процедуру и выполнить ее из своего DataContext. Пожалуйста, смотрите этот пост для получения дополнительной информации.

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