【问题标题】:Detect if a new record is the same as the existing record in database检测新记录是否与数据库中的现有记录相同
【发布时间】:2016-07-25 16:06:59
【问题描述】:

假设数据库中有一些这样的记录:

Id v1 v2 v3
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

假设我的新记录如下所示:
Id v1 v2 v3
1 1 2 1
5 5 5 5

现在,我想以这种方式插入我的新记录:
1.检查id是否存在于数据库中;
2.如果不存在,直接插入记录;
3.如果存在,则检测记录是否与新记录相同。如果不是,则仅更新更改的值。

由于我的真实数据非常大并且包含50多个变量并且我想快速插入,我想问一下是否有任何通用方法来检测相同ID的新记录是否与实体中的现有记录不同框架。我无法执行 50+ if 来查看哪些变量已更改。

请确保您的解决方案适用于大型数据集,谢谢。

【问题讨论】:

  • 如果ID已经存在,为什么还要检查50多个字段是否不同?您是否有特定的性能问题,或者您只是过早地进行优化?
  • 我正要问同样的问题。
  • If it exists, detect if the record is the same as the new one. If not, only update the changed values。通过用新记录替换整个旧记录,您将获得相同的效果
  • @PaulAbbott,问题是我想用不同的值更新这些字段

标签: c# sql-server entity-framework


【解决方案1】:

您可以使用MERGE 执行“upsert”操作:

MERGE INTO #t AS TGT
USING ( VALUES
    (1,1,2,1),
    (5,5,5,5) ) AS SRC (Id, v1, v2, v3)
ON TGT.Id = SRC.Id
WHEN MATCHED THEN
    UPDATE SET TGT.v1 = SRC.v1,
               TGT.v2 = SRC.v2,
               TGT.v3 = SRC.v3
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id, v1, v2, v3)
    VALUES (SRC.Id,
            SRC.v1,
            SRC.v2,
            SRC.v3);

Working example

BOL:https://msdn.microsoft.com/en-us/library/bb510625.aspx

【讨论】:

  • 谢谢克里斯。我发现IDbSetExtensions.AddOrUpdate 方法与实体框架中的MERGE 功能相同
猜你喜欢
  • 2012-09-19
  • 2012-05-13
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2015-09-23
相关资源
最近更新 更多