2015-04-16 24 views
6

Possiamo usare il metodo .Contains(string) in un'espressione LINQ, che suona come '% ricerca testo%', metodo .StartsWith(string), che suona come 'testo di ricerca%', e metodo .EndsWith(string), quello suona come "% cerca testo".Linq Query Dove() equivalente SQL%

Ma ho bisogno di qualcosa che suoni '% search% text%', che trovi tutti i contenuti contenenti 'search' e 'text', ma non sequenziali.

Esempio: Ho questi record:

cercare il mio testo

di ricerca per il testo

cercano il testo

In SQL, la query con LIKE '%search%text%' porta:

ricerca mia testo

ricerca per il testo

ma non porta il 'seek the text'.

Qualche idea?

+2

Utilizzare le espressioni regolari: sostituire '%' con '. *' E '_' con' .' – zerkms

+4

Funziona? '.Contains (" search "). Contiene (" text ")' ci possono essere alcuni errori di sintassi nel mio codice, ma spero che tu abbia la mia idea. – Turtle

+0

Si sta utilizzando LINQ su oggetti o LINQ-to-SQL? – Blorgbeard

risposta

7

È possibile utilizzare uno dei metodo di supporto:

var result = from o in ctx.table 
where SqlMethods.Like(o.column, "%search%text%") 
select o.column; 
0

si potrebbe usare qualcosa di simile:

var rx = new Regex("search.*text", RegexOptions.IgnoreCase); 
List<string> lists=new List<string>(){"search text","search this text","search my book"}; 
var result = lists.Where(x => rx.IsMatch(x)); 

Se avere un input in forma di "ricerca del testo%", quindi si può semplicemente sostituire "%" con ". *" e utilizzare come modello Reg ex.

+1

Non è stato possibile usare espressioni regolari con linq su sql. È necessario prima selezionare tutti i dati in memoria e quindi filtrarli con espressioni regolari, il che è inefficiente rispetto alla funzione simile che filtrerà i dati sul layer sql e restituirà i dati già filtrati. –

+0

Cosa intendi? Potrei facilmente fare: 'da x nelle liste dove rx.IsMatch (x) seleziona x;', Se stai dicendo del filtro in caso di linq a sql, allora, sì, hai ragione, il codice filtra in memoria vs filtraggio in SQL Server stesso, tuttavia c'è un sovraccarico nell'uso di linq in sql. – ANewGuyInTown

+0

Voglio dire che se hai miliardi di righe e vuoi filtrare solo 10 righe dovrai prima caricare quei miliardi di righe in memoria che è un grosso overhead –