2

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

我有一个 ID 列表。我想删除数据库中存在的任何 ID,以便留下需要添加的 ID 列表。换句话说,我需要where not in使用 Linq-To-Entities 执行 SQL 查询。问题是,这些方法不是产生那个 SQL,而是每个列表项产生一个 SQL 查询。

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

方法一

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

方法二

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

有没有办法构造 LINQ 查询以使其产生预期的not in形式,或者这些是唯一的解决方案吗?

4

2 回答 2

-1

怎么样的东西

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

var missingProviders = providerIds.Where(p => !providersInDb.Contains(p))
于 2013-05-14T03:39:01.750 回答
-1

棘手。我面前没有我的工具,所以我不知道这将如何准确。

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

在数据库上,获取所有提供者 ID,然后将其与内存中的 ID 结合起来。然后删除数据库中已知的那些。

于 2013-05-16T03:26:40.300 回答