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

Jed*_*ant 1 c# linq-to-entities entity-framework-5

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

 var newVersions = item.Versions
      .Where(s => db.ExistingVersions
           .Select(t=>t.versionID)
           .DoesNotContains(s.versionID));
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,我不知道如何解决它.我不想使用for循环,因为我相信这意味着我会有数百个数据库命中只是为了检查每个项目的版本.我正在加载多个项目,每个项目有多达100个版本.

Pat*_*iek 7

如果问题没有我认为的那么多,那么它应该不复杂.

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

var existingVersions = db.ExistingVersions.Select(x => x.VersionID).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,因为Contains它会更好:

var existingVersions = new HashSet(db.ExistingVersions.Select(x => x.VersionID).ToList());
Run Code Online (Sandbox Code Playgroud)

[编辑]:根据Magnus的评论,你可以ToList从上面的代码片段中删除.

然后:

var newVersions = items.Versions.Where(x => !existingVersions.Contains(x.VersionID));
Run Code Online (Sandbox Code Playgroud)

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