Linq到SQL,更新许多行
本文关键字:更新 许多行 SQL Linq | 更新日期: 2023-09-27 18:27:56
我需要用Linq将一行警报更新为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次,这真的很慢,效率低,而且没有优化。真正的查询更高级,更新更多的数据,使用a.Where(a=>a.Time!=null)和其他东西。
但只是为了改进上面的查询,它可以用非常高效的SQL查询来代替:
UPDATE [Alarms]
SET Alarm_Ack_UTC = GETUTCDATE()
GO
如何使用Linq-to-SQL实现这一点?还是不可能?
使用LINQ to SQL(或任何其他O/RM)都无法做到这一点。它们将始终从数据库中获取您想要更改的对象,并为该实体提供一个更新语句。如果您更改了10000个实体,那么您将至少有10000个更新语句。
如果速度太慢,请在这种情况下切换到存储过程或手动SQL语句。
我会选择编写存储过程。
然后,您可以在Linq-to-SQL设计器中将该存储过程映射到您的设计中。然后,它将作为DataContext的一种方法出现,并将导致更高效的设计。
如果需要像这样运行特定的优化SQL(通过Linq到SQL),则需要使用ExecuteQuery。所以用你的例子你可以做:
db.ExecuteQuery<Alarm>("UPDATE [Alarms] SET Alarm_Ack_UTC = GETUTCDATE()");
如果您想要一种更优化的方式来更新具有不同值的多行,那么您需要考虑使用SqlBulkCopy,它是SQL服务器特定的,但不是Linq-to-SQL。