2011-08-05 76 views
4

這樣的代碼:EF:避免多次更新語句

var compIds = from p in packinglist.List 
       select p.ComponentId; 
var components = from c in context.Components 
       where compIds.Contains(c.Id) 
       select c; 
foreach (var item in components) 
{ 
    item.CurrentSiteId = packinglist.DestinationId; 
} 
context.SaveChanges(); 

最終發行大量的SQL語句像

update [dbo].[Components] set [CurrentSiteId] = @0 where ([Id] = @1) 

有沒有一種方法來指示EF(代碼優先)發出以下聲明:

update [dbo].[Components] set [CurrentSiteId] = @0 where ([Id] in (....)) 

或者我應該考慮使用可用的SQLQuery方法之一或單獨的工具li小巧或大量或...?

+4

我對這個答案也很感興趣,但是根據我對EF的經驗,這看起來像是一個SQL查詢或存儲過程(您可以導入到EF中)的候選人。 – Tridus

+0

@Tridus:你應該將它作爲答案發布,因爲沒有其他方式,那麼直接使用SQL即可。 –

回答

2

目前沒有辦法在EF 4開箱即可執行批量更新。有一些很長的,複雜的工作,但最終會生成SQL。我建議使用存儲過程或T-SQL。下面是我在過去使用的快速T-SQL代碼段:

using (var context = new YourEntities()) 
{ 
    context.ExecuteStoreCommand(
        @"UPDATE Components SET CurrentSiteId = 1 WHERE ID IN(1,2,3,4)"); 
} 
0

這個最簡單的答案就是編寫一個查詢,並使用DbContext.SQLQuery()運行它。如前所述,EF本身無法做到這一點。