2017-03-27 10 views
0

私は、パラメータスニッフィングの有罪と思われるクエリを持っています。私はhereのようなインターセプタを適用したいのですが、他のクエリには影響を与えたくありません。 DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());Entity Frameworkの1つのクエリにインターセプタを追加するにはどうすればよいですか?

このコマンドの範囲とどのようにあなただけの単一のクエリへのインターセプタの範囲を限定するものではないとは何ですか?

コードがあります使用しましたか

私が最初に考えたのは、このような何かになった:

var interceptor = new OptionRecompileHintDbCommandInterceptor(); 
try 
{ 
    DbInterception.Add(interceptor); 

    // Do query 
} 
finally 
{ 
    DbInterception.Remove(interceptor); 
} 

をしかし、これを行うのは同じであるか、それは他のスレッドでのクエリに影響を与える可能性がありますか?

更新 別の考えが私に起こりました。インターセプタがいつ適用されるかを制御できない場合、インターセプタの条件付きifステートメントにロジックを入れてから、インターセプタに何らかのコンテキストを供給して、ロジックをいつ適用するのかを知る方法がありますか?

+0

これを静的なコンストラクタに追加できると考えると、すべてのクエリに影響すると思います。 –

答えて

1

2つのオプション私はこれについて考えることができます。それはグローバルレベルにあるため、あなたが取りたいクエリにあります。あなたは9 = 9と言うか、それはあなたが望むクエリーです。次にwhere句の部分を見つけて空の文字列で置き換えて、次に何をしようとしていたとしても続けることができます。

もう一方はかなり巧妙ですが、うまくいくはずです。

var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext; 

をしかし、その後、あなたはあなたの特定のDbContextのタイプにキャストすることができる必要があります:あなたのインターセプタコードでは、あなたがこれを行うことができます。そのDbContext型では、実行しているクエリであることを示すブール値のプロパティを追加することができます。その後、実行する直前に、それを真に設定し、それを傍受することができます。

関連する問題