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
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 方法会更快。
归档时间: |
|
查看次数: |
5977 次 |
最近记录: |