OfType<>和"is"查询的性能表现

3
在TPH继承中,这两种方式有差异:
context.Firms.OfType<RedFirm>()

以及这个:

context.Firms.Where(item => item is RedFirm);

在性能方面呢?

如果有任何性能差异,那并不是来自不同的 SQL,因为这两个查询的 SQL 完全相同:SELECT ... FROM [Firms] WHERE [Discriminator] = 'RedFirm' - Slauma
1个回答

7
OfType<T> 返回一个 IEnumerable<T> (或者一个 IQueryable<T> 或者其他的类型)。其内部使用了 is 操作符并将对象转换为 T 类型,只返回这些类型的对象。如果整个 IEnumerable<T> 可以强制转换为 IEnumerable<TResult>,那么 OfType<TResult> 还包括一个短路检查,并且会更快地执行,因为它不会检查集合中的每个单个项。

Where 不改变 IEnumerable<T> 的返回类型,而且由于你必须对它们进行强制转换(如果需要),所以 OfType<T> 应该会稍微快一点,因为它包含了这个调用。

相关链接: 为什么 OfType<> 比 Cast<> 更快?


1
这完全与 Enumerable 查询有关,与实体框架无关。这些都不适用。 - usr
在这种情况下,EF并不重要。据我所知,没有任何EF上下文可以翻译isOfType<T> - Michael Dunlap
@MichaelDunlap,请编辑您的答案;我检查了System.Linq.Enumerable.OfType<>,它没有您提到的短路检查(.NET 4.7.1)。 - yv989c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接