2010-03-29 11 views
8

Sono nuovo su LINQ, cercare in rete gli esempi LINQ che simulano l'istruzione LIKE di SQL non soddisfa me stesso.Versione LINQ dell'istruzione LIKE di SQL

Quello che voglio è che produce lo stesso risultato di una query come questa SQL

SELECT * FROM table_1 WHERE column_1 LIKE '__0%' 

voglio interrogare da Table_1 cui terzo carattere di column_1 è '0'

C'è dichiarazione equivalente in LINQ

: D grazie

+0

Non dimenticare di contrassegnare la risposta preferita. – Steven

risposta

9

È possibile utilizzare la classe SqlMethods. Fa parte di System.Data.Linq (a.k.a. LINQ to SQL).

from item in db.Table1 
where SqlMethods.Like(item.Column1, "__0%") 
select item; 
+1

se non è osservato dai commenti di Steven, questo non funziona con LINQ su Entity. Avrai bisogno di usare l'approccio di Andrey. – northpole

+1

Anche se 'SqlMethods.Like' consente la conversione diretta all'istruzione SQL LIKE, preferire l'uso dei metodi' string' (come StartsWith e Contains) laddove possibile, poiché ciò comporta un codice che è più gestibile. – Steven

0

Prova questo (non riesco a testarlo adesso):

from t in table_1 
where t.column_1[2] == '0' 
select t; 
+0

@Marcelo: Probabilmente perché il codice non funziona in quanto il carattere di sottolineatura ha un significato speciale quando viene usato con 'like', ma non quando viene usato con' StartsWith'. – Guffa

+0

Non controlla se la voce inizia con "__0" invece che se il terzo carattere è uno "0"? – Jens

+0

'_' indica qualsiasi carattere in un'istruzione' LIKE', mentre non ha alcun significato speciale per 'StartsWith'. –

8

I tipi di suoneria sono prodotti con i seguenti metodi: StartsWith, EndsWith e Contains. Prova a giocare con loro.

+0

Ha bisogno solo del terzo carattere per essere zero, quindi suppongo che dovrebbe anche guardare 'Sottostringa '. –

0

Nel tuo caso esatto (supponendo column_1 è una stringa):

from t in table_1 
where !String.IsNullOrEmpty(t.column_1) && t.column_1.Length >= 3 && t.column_1[2] == '0' 
select t; 

Naturalmente, si ha l'intera libreria .NET a portata di cessioni e potrebbe usare un po 'sofisticato modello API di corrispondenza (come le espressioni regolari) se è necessaria una soluzione più generale:

var regex = new Regex("..0.*"); 
var qry = from t in table_1 
      where regex.Match(t.column_1).Success 
      select t; 
+0

L'espressione regolare non funzionerà con L2SQL, che credo utilizzi l'OP (anche se non è chiaro al 100%) –

+0

oh, non lo sapevo. Ma le normali tecniche di abbinamento delle stringhe funzionano, giusto? –