いくつかのフィルタを使用してIQueryableクエリ式を構築しています。ある時点で、式に行があり、結果に依存して別のクエリを実行するかどうかを確認したい。下の例では、Any
がデータベースにヒットするため、データベースに3ヒットしました。データベースにアクセスせずにIQueryableでFirst()メソッドを使用する
時間の前にデータベースにアクセスすることなくAny
の機能を再利用する方法はありますか(すべての利点があるWhere()
など)。この場合
IQueryable<Car> visibleCars = context.Cars.Where(c => c.Status == "V");
IQueryable<Car> invisibleCars = context.Cars.Where(c => c.Status == "I");
IQueryable<Car> c = visibleCars.Any() && invisibleCars.Any()
? context.Cars.Where(c => c.Status == "x").ToList();
どのようにそのコードはコンパイルさえありませんか?どのように 'Any()'は 'Where()'のように動作しますか?必要に応じて述語を 'Any()'に渡すことができます。それはあなたが意味することですか? DB上の実際のクエリを避けるとは思えません。 DBデータをキャッシュする必要がありますが、実用的でない場合もあります。ここで成し遂げることができるとは思っていませんし、実際にそれを理解するためにシナリオについて十分な詳細を提供しているわけでもありません。 –
'WHERE'はクエリを構築する"ちょうど "です - 究極のWHERE句の部分です。しかし 'Any()'や 'First'を使うと、(与えられたラムダ式の)行があるかどうかを知りたければ**データベースへのアクセスが必要です** - 行が存在するかどうかをチェックする方法はありません。実際にデータベースに行くことはありません。これらの2つは**基本的には**異なる操作です。** **はありません。データベースに対するクエリなしで存在または行をチェックすることはできません。 –
このコードは確かにコンパイルされません。あなたが試みるかもしれない何かは.Top()です。これはIQueryableを返すので即座に実行されません。ただし、コンパイラが式を評価する必要がある場合は、常にdbヒットとなります。 – DevilSuichiro