首页 > 解决方案 > 在不将整个表加载到内存的情况下检查哪些消息已经存在

问题描述

我想在将消息添加到数据库之前检查是否已经存在任何消息,但是我当前的查询将整个表加载到内存中。从我的代码生成的查询基本上只是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,我更愿意在一次调用中执行此操作。

标签: c#entity-frameworkentity-framework-core

解决方案


根据您的用例,您可能需要一个接一个地插入它们并信任数据库唯一索引(您有一个,对吗?)如果它是重复的,则将其扔回您的脸上。

除了内存消耗之外,您的代码还有两个弱点:并发性(如果其他人在您检查重复项时插入怎么办)以及您要插入的记录本身可能是您没有检查的重复项。


推荐阅读