LINQ中db表不包含内存列表元素

本文关键字:包含 内存 列表元素 db LINQ | 更新日期: 2023-09-27 18:13:18

我见过这些StackOverflow答案,但当过滤列表在内存中时,它们不会产生相同的结果。

我有一个id列表。我想要删除数据库中存在的所有id,这样就只剩下一个需要添加的id列表。换句话说,我需要使用link - to - entities执行where not in SQL查询。问题是,这些方法不是生成SQL,而是为每个列表项生成一个SQL查询

var providerIds = new [] {"1130", "1", "16"};

方法1:
var missingProviders = (from provider in providerIds
                        where !JobProviders.Any(p => p.JobProviderID == provider)
                        select provider).ToList();

方法2 :

var missingProviders = (from provider in providerIds
                        where !(from p in JobProviders select p.JobProviderID).Contains(provider)
                        select provider).ToList();

是否有一种方法来构建LINQ查询,使其产生预期的not in形式,或者这些是唯一的解决方案?

LINQ中db表不包含内存列表元素

var providersInDb = (from provider in JobProviders
                     where providerIds.Contains(provider.JobProviderID)
                     select provider.JobProviderID).ToList();
var missingProviders = providerIds.Where(p => !providersInDb.Contains(p))

棘手。我手边没有工具,所以我不知道结果会如何。

var dbProviderIds = JobProviders.Select(p => p.JobProviderId);
var allProviders = dbProviderIds.Union(providerIds).Distinct();
var missing = allProviders.Except(dbProviderIds);

在DB上,获取所有提供者id,然后将其与内存中的id组合。然后删除数据库中已知的。