LINQ to SQL を介して MS SQL データベースで動作するアプリケーションを作成しています。フィルタリングを実行する必要がある場合や、フィルタリング条件が複雑すぎて SQL クエリに変換できない場合があります。それらを翻訳可能にしようとしていますが、アプリケーションが少なくとも動作することを望んでいますが、遅くなることもあります。
LINQ to SQL データ モデルはリポジトリ内に隠されているため、さまざまなケースに対して複数の GetAll メソッド オーバーロードを提供したり、上位レベルで使用するオーバーロードを認識したりしたくありません。したがって、リポジトリ内の式が翻訳可能であることをテストし、そうでない場合は、クエリのインスタンス化で NotSupportedException をスローする代わりに、データセット全体に対してメモリ内クエリを実行したいと考えています。
これは私が今持っているものです:
IQueryable<TEntity> table = GetTable<TEntity>();
IQueryable<TEntity> result;
try
{
result = table.Where(searchExpression);
//this will test our expression
//consuming as little resources as possible (???)
result.FirstOrDefault();
}
catch (NotSupportedException)
{
//trying to perform in-memory search if query could not be constructed
result = table
.AsEnumerable()
.Where(searchExpression.Compile())
.AsQueryable();
}
return result;
searchExpression
はExpression<Func<TEntity, bool>>
ご覧のとおりFirstOrDefault
、クエリをインスタンス化して、インスタンス化できない場合は例外をスローしようとしています。ただし、式が適切な場合は、無駄なデータベース呼び出しを実行します。Any
、または他の方法を使用することもできます。Count
それは よりも少し安価かもしれませんFirstOrDefault
が、それでも頭に浮かぶすべての方法はデータベースへのコストのかかる旅をしますが、必要なのは式をテストすることだけです。
実際のデータベース呼び出しなしで、私の式が「良い」か「悪い」かを判断する別の方法はありますか?
アップデート:
または、より一般的に言えば、LINQ が SQL の構築に失敗したときにインメモリ クエリを作成するように指示して、このテスト メカニズムがまったく必要ないようにする方法はありますか?