2

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;

searchExpressionExpression<Func<TEntity, bool>>

ご覧のとおりFirstOrDefault、クエリをインスタンス化して、インスタンス化できない場合は例外をスローしようとしています。ただし、式が適切な場合は、無駄なデータベース呼び出しを実行します。Any、または他の方法を使用することもできます。Countそれは よりも少し安価かもしれませんFirstOrDefaultが、それでも頭に浮かぶすべての方法はデータベースへのコストのかかる旅をしますが、必要なのは式をテストすることだけです。

実際のデータベース呼び出しなしで、私の式が「良い」か「悪い」かを判断する別の方法はありますか?

アップデート:

または、より一般的に言えば、LINQ が SQL の構築に失敗したときにインメモリ クエリを作成するように指示して、このテスト メカニズムがまったく必要ないようにする方法はありますか?

4

2 に答える 2

2

それ以外の

   result.FirstOrDefault(); 

使用するだけで十分でしょうか

    string sqlCommand = dataContext.GetCommand(result).CommandText; 

?

式が有効な Sql を生成しない場合、これは NotSupportedException をスローする必要がありますが、実際には sqlCommand を実行しません。

于 2011-07-27T17:04:47.397 に答える
1

これで問題が解決すると思います:

IQueryable<TEntity> table = GetTable<TEntity>();  
IQueryable<TEntity> result;
try
{
    return table.Where(searchExpression).ToList();
}
catch (NotSupportedException)
{
    //trying to perform in-memory search if query could not be constructed
    return table
        .AsEnumerable()
        .Where(searchExpression.Compile())
        .ToList();
}

したがって、メソッドが返すのは、式が有効な SQL に変換されたということです。それ以外の場合は、例外をキャッチしてメモリ内でクエリを実行します。searchExpressionこれはうまくいくはずですが、特定のものを変換できるかどうかを確認できるかどうか、あなたの質問には答えません。そんなものは存在しないと思います。

于 2011-07-27T10:09:37.790 に答える