2009-05-23 101 views
0

有没有人有关于如何在LINQ中运行以下语句的一些想法?LINQ to SQL更新

UPDATE FileEntity SET DateDeleted = GETDATE() WHERE ID IN (1,2,3) 

我已经来到了爱和恨LINQ,但到目前为止一直没有得到很好的结果。我想避免的显而易见的解决方案是枚举所有文件实体并手动设置它们。

foreach (var file in db.FileEntities.Where(x => ids.Contains(x.ID))) 
{ 
    file.DateDeleted = DateTime.Now; 
} 
db.SubmitChanges(); 

有与上面的代码,除了相当大的开销的问题是,每个实体具有可以相当大,因此对于大的更新有很多数据运行的交叉对于没有特别的数据库连接的数据字段原因。 (LINQ解决方案是延迟加载数据属性,但如果有一些方法只是使用LINQ to SQL更新字段,则不需要)。

我想一些查询表达式提供商的事情,将导致上述T-SQL ...

回答

2

LINQ不能在商店的更新执行 - 这是语言集成查询,无法更新。大多数(可能甚至全部)或映射器将生成一个select语句来获取数据,在内存中修改它,并使用单独的更新语句执行更新。智能OR映射器只会获取主键直到需要额外的数据,但他们通常会获取所有的数据,因为一次只获取一个属性会花费太多的代价。

如果您确实在意这种优化,请使用存储过程或手写SQL语句。如果你想要compacter代码,你可以使用下面的代码。

db.FileEntities. 
    Where(x => ids.Contains(x.ID)). 
    Select(x => x.DateDeleted = DateTime.Now; return x;); 

db.SubmitChanges(); 

我不喜欢这样,因为我觉得它不太可读,但有些人更喜欢这样的解决方案。

0

LINQ to SQL是一个ORM,就像任何其他的一样,正因如此,它没有被设计为处理批量更新/插入/删除。 L2S,EF,NHibernate,LLBLGen和其他的一般思想是为您处理关系数据到您的对象图的映射,而不需要管理大型存储过程的库,这最终会限制您的灵活性和适应性。

当谈到批量更新时,最好留给他们最好的东西......数据库服务器。 L2S和EF都提供了将存储过程映射到模型的功能,这允许您存储的过程在某种程度上以实体为导向。自从您使用L2S以来,只需编写一个将身份集作为输入的proc,并在问题开始时执行SQL语句。将存储的proc拖到你的L2S模型上,然后调用它。

它是手头问题的最佳解决方案,它是批量更新。与报告一样,对象图和对象关系映射不是批量处理的最佳解决方案。