如何使用 EF Core 在列表中选择不在表中的值?

use*_*870 6 c# linq entity-framework entity-framework-core ef-core-2.1

我有一个相当大的字符串列表(30k+),我需要使用 Entity Framework Core 检查表中不存在哪些字符串。

像这样但没有发送每个项目的请求来检查:

var notFoundItems = hugeList.Where(c => !tableToCheck.Any(x => x.Id == c)).ToList();
Run Code Online (Sandbox Code Playgroud)

我找到了答案,但使用T-SQL

And*_*ský 5

T-SQL 可能是一种很好的方法,但在您的情况下,您必须创建一个临时表并进行连接。30k 并不是太多的记录,因此在应用程序端比较记录可能会更容易。在这种情况下,你可以这样做:

var idList = tableToCheck.Select(x => x.id).ToList();
var notFoundItems = hugeList.Where(item => idList.All(id => id != item));
Run Code Online (Sandbox Code Playgroud)

由于数据库中的字符串是 ID,因此您可以做得更好并使用 HashSet 和 Contains 方法,其复杂度为 O(1):

var idSet = tableToCheck.Select(x => x.id).ToHashSet();
var notFoundItems = hugeList.Where(item => !idSet.Contains(item));
Run Code Online (Sandbox Code Playgroud)

最终,性能取决于数据库中数据集的大小。如果 DB 表很大并且您必须获取数百万个 ID,那么 T-SQL 方法会更快。


Ada*_*ent 0

由于您已经有了 T-SQL 解决方案,因此这是使用原始 SQL 查询的好例子。肯定会出现 SQL 查询无法在 LINQ 中表达或 LINQ 语句未生成优化查询的情况。