Linq to SQL,更新了很多行

时间:2012-03-16 11:00:53

标签: c# linq linq-to-sql

我需要使用Linq to SQL更新一行警报,其中包含超过100000行。

这意味着简单的更新,例如:

foreach (var alarm in Alarms)
{
    alarm.Alarm_Ack_UTC = DateTime.UtcNow;
}

SubmitChanges();

给我一​​个

的SQL查询
SELECT [t0].[Alarm_ID], [t0].[Alarm_Application_Number], [t0].[Alarm_Ack_UTC], [t0].[Alarm_DateTime_UTC], [t0].[Alarm_Message_Number], [t0].[Username], [t0].[Runtime_Message], [t0].[Alarm_Application_Name], [t0].[Alarm_Application_Computer], [t0].[Alarm_GUID], [t0].[Alarm_Comments]
FROM [Alarms] AS [t0]
GO

-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 DateTime = '2012-03-16 11:56:25.850'
-- EndRegion
UPDATE [Alarms]
SET [Alarm_Ack_UTC] = @p1
WHERE [Alarm_ID] = @p0
GO

-- Region Parameters
DECLARE @p0 Int = 2
DECLARE @p1 DateTime = '2012-03-16 11:56:25.851'
-- EndRegion
UPDATE [Alarms]
SET [Alarm_Ack_UTC] = @p1
WHERE [Alarm_ID] = @p0
GO

-- Region Parameters
DECLARE @p0 Int = 3
DECLARE @p1 DateTime = '2012-03-16 11:56:25.851'
-- EndRegion
UPDATE [Alarms]
SET [Alarm_Ack_UTC] = @p1
WHERE [Alarm_ID] = @p0
GO

重复100000次,这是非常缓慢,低效和未经优化的。 真正的查询更高级,更新更多数据,使用.Where(a => a.Time!= null)和其他东西。

但只是为了改进上面的查询,可以用非常有效的SQL查询替换:

UPDATE [Alarms]
SET Alarm_Ack_UTC = GETUTCDATE()
GO

如何使用Linq to SQL实现这一目标?或者这是不可能的?

3 个答案:

答案 0 :(得分:3)

使用LINQ to SQL(或任何其他O / RM)无法执行此操作。它们将始终从要更改的数据库中获取对象,并为该实体提供单个更新语句。如果更改10,000个实体,则至少有10,000个更新语句。

如果速度太慢,请在这种情况下切换到存储过程或手动SQL语句。

答案 1 :(得分:2)

如果您需要像这样运行特定的优化SQL(通过Linq to SQL),则需要使用ExecuteQuery。 因此,您可以使用您的示例:

  db.ExecuteQuery<Alarm>("UPDATE [Alarms] SET Alarm_Ack_UTC = GETUTCDATE()");

如果您想要一种更优化的方法来更新具有不同值的多个行,那么您需要考虑使用SqlBulkCopy这是SQL Server特定的,但不是Linq to SQL。

答案 2 :(得分:2)

我选择编写存储过程。

然后,您可以将Linq-to-SQL设计器中的存储过程拖放到您的设计中。然后它将作为DataContext的一种方法出现,并将带来更高效的设计。