【问题标题】:Linq to SQL, update many rowsLinq to SQL,更新许多行
【发布时间】:2012-03-16 19:27:35
【问题描述】:

我需要使用 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 次,真的很慢,效率低,没有优化。 真正的查询更高级,更新更多数据,使用a .Where(a => a.Time != null) 等。

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

UPDATE [Alarms]
SET Alarm_Ack_UTC = GETUTCDATE()
GO

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

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这就是我害怕的。那我就做一个存储过程吧。
    【解决方案2】:

    我会选择编写存储过程。

    然后,您可以在 Linq-to-SQL 设计器中映射到此存储过程,方法是将其拖到您的设计中。然后它将作为您的 DataContext 的一个方法出现,并将导致更高效的设计。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        相关资源
        最近更新 更多