Asp.net 构建检查重复项的导入过程

Asp.net 构建检查重复项的导入过程,asp.net,nhibernate,Asp.net,Nhibernate,使用ASP.NET,我正在构建一个管理工具,它需要一个函数来导入电子邮件地址列表。上传文件后,我想检查提供的任何电子邮件地址的现有记录。对于不存在的电子邮件地址,我将使用DAO创建它们 基本上我想: 接收电子邮件列表 检索现有电子邮件的数据 在数据库中为新电子邮件创建数据 返回列表中所有电子邮件的完整数据 由于我想知道哪些电子邮件存在于前面,我的第一个想法是查询表中的所有记录电子邮件在哪里('Email001FromFile','Email002FromFile','etc…),但列表可能包含数

使用ASP.NET,我正在构建一个管理工具,它需要一个函数来导入电子邮件地址列表。上传文件后,我想检查提供的任何电子邮件地址的现有记录。对于不存在的电子邮件地址,我将使用DAO创建它们

基本上我想:

  • 接收电子邮件列表
  • 检索现有电子邮件的数据
  • 在数据库中为新电子邮件创建数据
  • 返回列表中所有电子邮件的完整数据
  • 由于我想知道哪些电子邮件存在于前面,我的第一个想法是查询表中的所有记录
    电子邮件在哪里('Email001FromFile','Email002FromFile','etc…)
    ,但列表可能包含数千个电子邮件地址,我不确定向IN运营商提供这么多电子邮件地址是否是个好主意

    我还想过在列表中循环并检查每封电子邮件的记录,但这可能会产生太多的查询

    我的下一个想法是生成一个临时表来保存列表,并修改IN子句以使用临时表,而不是一个显式的项目列表,但这需要我直接执行SQL或存储过程,因为我使用NHibernate来访问我的数据库,所以我不想这样做


    虽然我使用的是ASP.NET(C#)和NHibernate,任何关于这方面的具体答案都会很有帮助,但我只是想了解一下如何处理这种情况。

    如果无法将现有电子邮件加载到内存中,我可能会采用某种批处理方法。在你提到的查询中进行查询,但只对
    n
    电子邮件进行查询。您可以将硬编码n设置为某个值,也可以将其设置为新电子邮件总数的函数


    我不确定这种方法是否真的比执行一次IN查询快(比我有更多数据库技能的人必须回答这个问题),但这将允许您向用户指示某种加载状态。

    您对重复的电子邮件做了什么吗


    您可以在表上设置一个唯一的约束,只允许输入一次电子邮件地址,然后捕获SQL在您尝试插入副本时抛出的异常

    仅仅因为您正在使用NHibernate,就不应该让您推迟使用存储过程。有时SP是最好的方法,特别是在这种情况下,您的问题是不希望将所有现有记录都放入内存。在工作中使用正确的工具,而不仅仅是你手头上的工具。对于每一种你可以使用的工具,在一次交易中这不会花费太长时间吗?我想你无论如何都得批处理大量要导入的记录。