以下のようなコードがある場合、データベースは と に対して 2 回呼び出されAny
ますWhere
か?
if (context.SomeTable.Any(x => x.SomeValue == "A"))
var result = context.SomeTable.Where(x => x.SomeValue == "A")
以下のようなコードがある場合、データベースは と に対して 2 回呼び出されAny
ますWhere
か?
if (context.SomeTable.Any(x => x.SomeValue == "A"))
var result = context.SomeTable.Where(x => x.SomeValue == "A")
はい、そうなると思います。
それをどのように処理したいかは、コンテキストによって異なります。たとえば、次のことが必要な場合があります。
var result = context.SomeTable
.Where(x => x.SomeValue == "A")
.Take(10)
.ToList();
if (result.Count == 0)
{
// Indicate that there were no results
}
else
{
// Use it somehow
}
しかしもちろん、これは返されるレコード数を制限するために意図的に書かれており、結果を具体化します。レコードの数がわかるまでどのパスをたどるかわからず、その時点でデータをメモリにロードしたくない場合は、さらに厄介になります。
はい、2回呼び出されます。また、そのようなチェックを行う意味はありません。データがある場合は、とにかくそれらをロードする必要があります。
注実際には、コードは 1 つのAny
クエリのみを実行します。2 番目のクエリはここでのみ定義され、結果を取得しようとすると実行されます。