2011-08-05 75 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本身无法做到这一点。