c# - 在不将整个表加载到内存的情况下检查哪些消息已经存在

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

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

最佳答案

如果你想检查表中有多少行,你可以使用 SELECT COUNT(*) FROM TABLE。 在执行任务之前执行此查询。

或者如果您希望在无法插入行(重复)时更新 你需要为此使用合并插入。

合并插入 (MySql) => https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

合并插入 (Oracle) => https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606

关于c# - 在不将整个表加载到内存的情况下检查哪些消息已经存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999936/

相关文章:

c# - EF 6 代码第一个存储过程 - 只读

c# - Entity Framework 核心 3.1.7 : failure during Update of record

C# 在富文本框中以单独的行输出 csv 数据

c# - 使用 C# 将值写入注册表

c# - 在 CSharpCompilation .net Core 中未获取命名空间/引用

c# - 如何在本地保存整个字典并在需要时加载它?

ASP.net:由于数据库错误,无法使用网站管理工具

c# - Initializer.Seed() 在 context.SaveChanges() 上抛出异常

c# - 添加迁移显示错误 EntityFrameworkCore.Design 未安装

c# - 跳过,包括在内