Ho una query che sospetto sia colpevole di sniffing dei parametri. Mi piacerebbe applicare un intercettore come quello trovato qui , ma non voglio altre domande interessate.
Il codice utilizzato è: DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
Qual è lo scopo di questo comando e in che modo limiti l'ambito di un intercettore a una singola query?
Il mio primo pensiero è stato di fare qualcosa del genere:
var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
DbInterception.Add(interceptor);
// Do query
}
finally
{
DbInterception.Remove(interceptor);
}
Ma è lo stesso a fare o potrebbe influenzare le query su altri thread?
Aggiorna Un altro pensiero mi è venuto in mente. Se non riesco a controllare quando viene applicato un intercettore, c'è un modo per mettere la logica in un'istruzione condizionale if
nell'intercettore e quindi fornire un qualche tipo di contesto all'intercettore in modo che sappia quando applicare la logica?
Due opzioni a cui posso pensare, poiché è a livello globale, è nella query che vuoi individuare, puoi fare qualcosa dove dici 9 = 9 o qualcosa che è sempre vero, così sai che è la query tu vuoi. Quindi puoi trovare e sostituire quello dove parte della clausola con una stringa vuota e poi continuare con quello che avresti intenzione di fare.
L'altro è un po 'più snello, ma dovrebbe funzionare. Nel tuo codice interceptor, puoi farlo:
var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;
Ma allora dovresti essere in grado di lanciarlo sul tuo specifico tipo DbContext. Su quel tipo di DbContext, puoi semplicemente aggiungere alcune proprietà booleane che indicano che questa è la query che stai utilizzando. Quindi, proprio prima di eseguirlo, puoi impostarlo su true ovunque e sarai in grado di intercettarlo.