c# - 在不将整个表加载到内存的情况下检查哪些消息已经存在
问题描述
我想在将消息添加到数据库之前检查是否已经存在任何消息,但是我当前的查询将整个表加载到内存中。从我的代码生成的查询基本上只是select * from tableName
.
如何重写此查询以在数据库中进行评估?
public void AddMessages(IEnumerable<Message> messages)
{
if (messages == null)
throw new ArgumentNullException(nameof(messages));
var duplicates = (from currMsg in context.Messages
where messages.Any(msg =>
msg.Prop1 == currMsg.Prop1 &&
msg.Prop2 == currMsg.Prop2 &&
msg.Prop3 == currMsg.Prop3)
select currMsg);
var messagesWithoutDuplicates = messages.Except(duplicates);
context.Messages.AddRange(messagesWithoutDuplicates);
context.SaveChanges();
}
我也可以在循环中运行它,但是我会创建许多数据库调用而不是 1,我更愿意在一次调用中执行此操作。
解决方案
根据您的用例,您可能需要一个接一个地插入它们并信任数据库唯一索引(您有一个,对吗?)如果它是重复的,则将其扔回您的脸上。
除了内存消耗之外,您的代码还有两个弱点:并发性(如果其他人在您检查重复项时插入怎么办)以及您要插入的记录本身可能是您没有检查的重复项。