2015-02-19 9 views
5

Quando esamino la query sql che sputa il linq, ho notato che inserisce un ESCAPE N' ~ 'quando si esegue un comando LIKE. Come faccio a liberarmi di questo? Sembra che la query impieghi il doppio del tempo con ESCAPE in sql.LINQ inserisce 'ESCAPE N' ~ 'nella query

Ecco il LINQ

var SearchPhrase = "xyz"; 

var result = (from I in db.myTabl 
       where i.col1.contains(SearchPhrase) 
       select I).toList(); 

quando guardo lo sql attuale

sembra qualcosa di simile:

SELECT 
     [Extent1].Col1 
    FROM myTable As [Extent1] 
    WHERE [Extent1].Col1 LIKE @p__linq__3 ESCAPE N'~' 
+1

vuol aggiungere quando il tuo argomento di contiene è ' "xyz"'? Dovrebbe solo aggiungere che se il tuo input include caratteri jolly LIKE ('%, _, [,], ^') –

+0

Prova a cambiare "xyz" in una variabile anziché in un valore letterale. Le prestazioni lente della query potrebbero non essere dovute a ESCAPE ma a causa della mancanza di un'adeguata ottimizzazione delle query correlata alla clausola where. –

+0

xyz è una variabile che entra nel metodo. Ma lo metto come una var nel codice per un esempio. – Arcadian

risposta

0

Linq di utilizzare SQL '`' come è la fuga di default carattere quando si fanno paragoni. Risulterà solo un problema se la tua stringa contiene effettivamente ~ caratteri.

Utilizzare SqlMethods.Like per sovrascrivere questo.

+2

The SqlMethods.Like funziona solo per Linq To Sql, non per Linq To Entities – khoailang

3

A quanto pare,

var SearchPhrase = "xyz"; 
var result = (from I in db.myTabl 
      where i.col1.contains(SearchPhrase) 
      select I).toList(); 

aggiungerà ESCAPE N '~' nella query sottostante.

Tuttavia utilizzando un filtro costante come il seguente, non produce sfuggire caratteri nella query sottostante

var result = (from I in db.myTabl 
      where i.col1.contains("xyz") 
      select I).toList(); 

che significa, filtri variabili sono sfuggiti, mentre le costanti non sono.

Quindi, in questo caso, abbiamo bisogno di una variabile da utilizzare come filtro costante.

Utilizzando il seguente, non dovrebbe aggiungere eventuali caratteri di escape:

var SearchPhrase = "xyz"; 
var result = (from I in db.myTabl 
      where SqlMethods.Like(i.col1, string.Format("%{0}%", SearchPhrase)) 
      select I).toList(); 

ma questo funziona solo con LINQ to SQL.

L'altra alternativa è quella di incorporare il valore della variabile come una costante, che viene fatto utilizzando la seguente come spiegato nella SO article

+0

Le scuse non hanno visto la risposta da @alanh –

+0

L'articolo SO funzionerà per LINQ su Entity? Sembra troppo lavoro per fare qualcosa di semplice. – Arcadian

+0

Sì, la soluzione nell'articolo SO funzionerà per LINQ su Entity, non è molto lavoro, basta usare questi due metodi statici e aggiungere l'espressione al posto della condizione where. –

0

Se si utilizza LINQ 2 entità, utilizzare SqlQuery per rimuovere il carattere "~".

Basta aggiungere il valore da confrontare come una query sql ordinaria.

Ad esempio:

var resultList = context.TableName.SqlQuery(
       "SELECT * FROM TableName WHERE field LIKE '%" + fieldValue+ "%' ").ToList(); 
+4

Attenzione all'iniezione SQL. –