我需要使用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实现这一目标?或者这是不可能的?
答案 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的一种方法出现,并将带来更高效的设计。