編集: EF バージョン 6.1.1 で修正されました。そして、この答えはもはや現実的ではありません
SQL Server と EF4-6 の場合、Count() は Any() よりも約 2 倍速く実行されます。
Table.Any() を実行すると、次のようなものが生成されます (アラート: 理解しようとしている脳を傷つけないでください)
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [Table] AS [Extent1]
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [Table] AS [Extent2]
)) THEN cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
これには、条件付きの行を 2 回スキャンする必要があります。
Count() > 0
自分の意図を隠してしまうので、書くのは好きではありません。これにはカスタム述語を使用することを好みます。
public static class QueryExtensions
{
public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
return source.Count(predicate) > 0;
}
}