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

时间:2019-05-22 19:46:21

标签: c# entity-framework linq ienumerable

在我的代码上运行事件探查器时,我显示的总执行时间为20秒,其中IEnumerable调用占用了14秒(14,788.4 ms).Any()有任何方法可以加快执行速度呢?

要从中拉出的表共有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()是唯一的瓶颈。

1 个答案:

答案 0 :(得分:10)

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