c# - 使用 linq to entities 检查数据库中是否已经存在实体列表

标签 c# linq-to-entities entity-framework-5

我有一个来自外部来源的实体列表。我需要将它与我已有的进行比较,并且只添加不存在的。下面是伪代码。

 var newVersions = item.Versions
      .Where(s => db.ExistingVersions
           .Select(t=>t.versionID)
           .DoesNotContains(s.versionID));

这显然行不通,我不确定如何解决。我不想使用 for 循环,因为我相信这意味着我将有数百个数据库命中,只是为了检查每个项目的版本。我正在加载多个项目,每个项目有多达 100 个版本。

最佳答案

如果没有比我想的更多的问题,那么它应该不复杂。

假设VersionID是唯一标识符,那么你可以这样做:

var existingVersions = db.ExistingVersions.Select(x => x.VersionID).ToList();

请注意,Contains最好是:

var existingVersions = new HashSet(db.ExistingVersions.Select(x => x.VersionID).ToList());

[编辑]:根据 Magnus 的评论,您可以删除 ToList来自上面的代码片段。

然后:

var newVersions = items.Versions.Where(x => !existingVersions.Contains(x.VersionID));

这可能是性能最高的,因为在调用数据库时,您只选择了 VersionID .其他选项涉及编写自定义 IEqualityComparer<T> 并使用 Except ,但您必须从数据库中提取所有内容,这可能成本更高。

关于c# - 使用 linq to entities 检查数据库中是否已经存在实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15347613/

相关文章:

c# - 如何在 C# 中解决此错误?

c# - LINQ to Entities 外键关联

c# - 使用基类和私有(private) setter 时,关键组件 'Id' 不是类型 'TypeName' 的声明属性

stored-procedures - EF5 需要更新 ContainerName.FunctionImportName 以在更新模型时访问存储过程,任何迷人的解决方案?

c# - 将所有 mp3 加载到音频数组中

c# - 在 C# 中使用 Dictionary<string, string> 进行解析

c# - 代码优化: Reduce method calling by storing return value

c# - 使用存储库模式获取相关表 Entity Framework

c# - 防止在 Entity Framework 上的 TPT 继承中加载子类表行

c# - 当有绑定(bind)导航器时,如何在设计时停止 winforms 中的 datagridview 自动生成列?