c# - 避免在数据库中添加重复项的最佳方法

标签 c# sql-server hashset

我有一个包含三列的 SQL Server 表:

表1

col1 int
col2 int
col3 string

我为所有三列定义了唯一约束 (col1, col2, col3)

现在,我有一个 .csv 文件,我想从中添加记录到此表中,并且 *.csv 文件可以包含重复记录。

我已经搜索了各种选项来避免上述场景中的重复。以下是对我来说效果很好的三个选项。请看一下并就每种方法的优缺点提出一些想法,以便我选择最好的方法。

选项#1:

首先避免重复,即从 csv 文件将对象添加到列表时。我用过HashSet<T>为此,并重写以下类型 T 的方法:

public override int GetHashCode()
{
    return col1.GetHashCode() + col2.GetHashCode() + col3.GetHashCode();
}

public override bool Equals(object obj)
{
    var other = obj as T;
    if (other == null)
    {
        return false;
    }
    return col1 == other.col1
        && col2 == other.col2
        && col3 == other.col3;
}

选项#2

List<T>而不是HashSet<T> .

将所有对象添加到 List<T> 后删除重复项

    List<T> distinctObjects = allObjects
        .GroupBy(x => new {x.col1, x.col2, x.col3})
        .Select(x => x.First()).ToList();

选项#3

将所有对象添加到 DataTable 后删除重复项.

public static DataTable RemoveDuplicatesRows(DataTable dataTable)
{
    IEnumerable<DataRow> uniqueRows = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
    DataTable dataTable2 = uniqueRows.CopyToDataTable();
    return dataTable2;
}

虽然我没有比较它们的运行时间,但我更喜欢选项#1,因为我第一步就是删除重复项 - 所以只按照需要的进行。

请分享您的观点,以便我选择最好的。

非常感谢!

最佳答案

我喜欢选项 1:HashSet<T>提供了一种在将重复数据发送到数据库之前避免重复数据的快速方法。你应该实现一个更好的GetHashCode ,例如使用 What is the best algorithm for an overridden System.Object.GetHashCode? 中的 Skeet 实现

但有一个问题:如果表中已包含可能与 CSV 重复的数据怎么办?您必须先复制整个表格才能获得简单的 HashSet真正工作。您可以这样做,但为了解决这个问题,我可能会将选项 1 与临时表和插入语句(如 Skip-over/ignore duplicate rows on insert)配对。的:

INSERT dbo.Table1(col1, col2, col3)
SELECT col1, col2, col3 
FROM dbo.tmp_holding_Table1 AS t
WHERE NOT EXISTS (SELECT 1 FROM dbo.Table1 AS d
WHERE col1 = t.col1
AND col2 = t.col2
AND col3 = t.col3);

通过这种组合,可以最大限度地减少与数据库传输的数据量。

关于c# - 避免在数据库中添加重复项的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641755/

相关文章:

带有两个 ON 子句的 SQL 连接(嵌套连接?)

c# - HashSet 枚举器有什么作用?

将迭代器中的项目添加到数据集时的 Java 错误 - 重复单个值

c# - 检查用户是否输入了正确的文件系统路径

c# - 如何通过id删除列表中的多个对象?

sql - 帮我写一个 SQL 交叉表查询

sql-server - 我如何在 sql 中找到我连接到的数据库名称

java - 各种小HashSet和1个大HashSet的搜索差异是什么?

c# - 在 C# 中通过 SSH.NET 隧道连接到 MySQL 数据库时出现 "Unable to connect to any of the specified MySQL hosts"

c# - 可重复使用的 ModalPopupExtender