这是一个简单的问题,但我完全迷失了如何处理这个问题。
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()
}
我已经在考虑以旧方式进行操作并手动执行该查询。我不喜欢它,但它可能比运行数百个更新查询更好。
答案 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。