有没有比 .Any() 更快的方法来查找 IEnumerable<T> 是否有任何数据?

Is there any faster way than .Any() to find if IEnumerable<T> has any data?

当 运行 我的代码上的探查器显示总执行时间为 20 秒时,其中 14 秒(14,788.4 毫秒)被对 IEnumerable.Any() 的调用占用有什么办法可以加快速度吗?

从中提取的 table 共有约 484,000 条记录,因此最好避免将其放入内存。

我尝试用 IEnumerable.Count() > 0 替换 IEnumerable.Any() 并使用 IEnumerable.GetEnumerator().MoveNext()

所有这些都没有显着改变执行时间。

IEnumerable<Registration> result = [Fill by Query] (19ms)
[Conditions] (<0.1ms for all)
[Tried all of the following with no performance impact]
return result != null && result.Any(); (14000ms)
return result != null && result.Count() > 0; (14000ms)
return result != null && result.GetEnumerator().MoveNext(); (14000ms)
return (result?.Any() ?? false); (14000ms)

我希望我能找到可以将总执行时间减少到合理数量的方法,IEnumerable.Any() 是唯一的瓶颈。

您需要调用Queryable.Any,而不是Enumerable.Any,这样实际的数据库查询可以调整为只查询是否存在任何项目。通过将 IQueryable 变成 IEnumerable,您可以确保在其上执行的操作都涉及在执行该操作之前在内存中具体化查询结果。