linq to sql更新多条记录

时间:2011-11-02 16:27:15

标签: c# linq-to-sql c#-4.0

这是一个简单的问题,但我完全迷失了如何处理这个问题。

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()
}

我已经在考虑以旧方式进行操作并手动执行该查询。我不喜欢它,但它可能比运行数百个更新查询更好。

2 个答案:

答案 0 :(得分:5)

你认为这种方法有两个问题 - 你将执行数百个单独的更新语句,你必须首先阅读它们才能进行更改。

这是ORM中常见的弱点。

根据一些谷歌链接,我发现了以下博客文章,在这方面确实有一些有趣的事情要说: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

答案 1 :(得分:1)

您可以使用存储过程并在DataContext中执行它。有关其他详细信息,请参阅this post