使用ASP.NET,我正在构建一个管理工具,需要一个函数来导入电子邮件地址列表。上传文件后,我想检查所提供的任何电子邮件地址的现有记录。对于不存在的电子邮件地址,我会使用我的DAO创建它们。
基本上我想:
由于我想知道预先存在哪些电子邮件,我首先想到的是查询表中的所有记录WHERE Email IN ('Email001FromFile', 'Email002FromFile', 'etc...')
,但该列表可能包含数千个电子邮件地址,我不确定是否提供IN运营商的许多电子邮件地址都是个好主意。
我还考虑过遍历列表并检查每封电子邮件的记录,但这可能会产生太多的查询。
我的下一个想法是生成一个临时表来保存列表并修改IN子句以使用临时表,而不是明确的项列表,但这需要我直接执行SQL或存储过程,我因为我正在使用NHibernate来访问我的数据库,所以我不愿意这样做。
虽然我使用的是ASP.NET(C#)和NHibernate,但任何特定的答案都会有所帮助,我真的只是在寻找有关如何处理这种情况的一般想法。
答案 0 :(得分:2)
如果将现有的电子邮件加载到内存中不是一种选择,我可能会选择某种批量方法。转到你提到的IN查询,但只对n
个电子邮件执行此操作。您可以将硬编码n设置为某个值,或者您可以将其作为新电子邮件总数的函数。
我不确定这种方法是否真的比执行一个单一的IN查询更快(有比我更多的数据库技能的人必须回答这个问题),但这样可以指出某种加载状态给用户。
答案 1 :(得分:0)
您是否正在处理重复的电子邮件?
您可以在表上放置一个UNIQUE约束,只允许输入一次电子邮件地址 - 然后捕获SQL将在您尝试插入重复项时抛出的异常。