gpt4 book ai didi

c# - LINQ 简单查询需要超过 30 秒

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:13 25 4
gpt4 key购买 nike

我在使用 EF 进行非常简单的查询时遇到问题。以下查询需要超过 30 秒才能运行并抛出超时错误:

var results = _Context.Entity
.Where(x => list1.Contains(x.Id))
.Where(x => !list2.Contains(x.Id))
.ToList();

下面的程序运行时间为 1/4 秒:

var results = _Context.Entity
.Where(x => list1.Contains(x.Id))
.ToList();

results = results
.Where(x => !list2.Contains(x.Id))
.ToList();

数据库中的集合大约有 60k 行,我的两个列表大约有 5k int。这是缓存问题吗?我的应用程序中有许多类似的查询,它们都运行顺利。我可以做些什么来改进它?

最佳答案

在情况 1 中,您构建了一个更复杂的查询,如下所示:

SELECT * FROM Entities WHERE Id in (...) AND Id NOT IN (...)

但是在情况 2 中你做了一个简单的查询

SELECT * FROM Entities WHERE Id in (...)

然后在C#中筛选出结果。如果您的 list2 实际上是一个 HashSet,它会工作得更快。但是,您让 SQL Server 返回多余的行,这些行将被过滤掉。

我猜,第一个运行得慢一些,因为它没有使用索引,但我不确定,我可能是错的。

更重要的是,您真正想要的是获取ID在list1中,但不在list2中的所有项目。在这种情况下,您不需要让 SQL 服务器处理它 - 只需在代码中过滤掉它,然后只传递您需要的那些 ID:

var listToSearch = list1.Except(list2).ToArray();
var results = _Context.Entity.Where(x => listToSearch.Contains(x.Id)).ToList();

关于c# - LINQ 简单查询需要超过 30 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52220704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com