2009-11-06 13 views
22

Come posso produrre questa query utilizzando NHibernate.Linq?NHibernate.Linq LIKE

WHERE this_.Name LIKE @p0; @p0 = 'test' // Notice NO % wild card 

Nota, questo non è Linq To Sql o Entity Framework. Questo è NHibernate.

Modifica:

Ecco la query desiderata utilizzando ICriteria:

criteria.Add(Expression.Like("Name", "test")); 
return criteria.List<Theater>(); 

risposta

6

Con NH 4 (e probabilmente un po 'prima), un'estensione di stringa Like incorporata è disponibile all'interno dello spazio dei nomi NHibernate.Linq: Like(this string matchExpression, string sqlLikePattern). (Esso è definito sulla classe NHibernate.Linq.SqlMethods estensione.)

using NHibernate.Linq; 
... 
session.Query<Theater>() 
    .Where(t => t.Name.Like("test")); 
17

Credo che questo è quello che stai cercando:

var theaters = from theater in Session.Linq<Theater>() 
       where theater.Name.Contains("test") 
       select theater; 

Secondo le mie prove che genera un'istruzione SQL "LIKE": "... DOVE teatro.Nome LIKE% test%"

che è esattamente l'output dello snippet di criteri che hai fornito.

+1

Utilizzando Criteri (previste nella domanda), non sto vedendo i caratteri jolly% generati. – mxmissile

+0

Ho appena eseguito il test unitario che ho con il codice fornito nella mia risposta e ha prodotto un'istruzione SQL con il carattere jolly% in entrambe le estremità della stringa di serch. Ho anche eseguito lo stesso test utilizzando il criterio Equivalente e ottengo la stessa identica istruzione SQL se uso criteri. Add (Expression.Like ("Nome", "test", MatchMode.Anywhere)); Utilizzo NHibernate 2.1 con SQL Server 2005. Se si utilizza la stessa configurazione, è possibile visualizzare gli stessi risultati. – tolism7

+0

Il problema è che non voglio i caratteri jolly che usano Linq. Il mio commento sopra questo rispondeva alla tua risposta "esattamente l'output dello snippet di criteri che hai fornito". Scusa se non ero chiaro. Posso raggiungere la query desiderata con ICriteria come indicato nella domanda, ma non riesco a raggiungerlo usando Linq. – mxmissile

15

Ho avuto lo stesso problema nel mio progetto e trovato una soluzione:

session.Linq<Theater>() 
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test"); 

Questo si traduce in SQL per

SELECT ... WHERE Name LIKE '%test' AND Name LIKE 'test%' 
+4

aggiunta: '&& x.Name.Length ==" test ".Length'. altrimenti si finirebbe con risultati come 'test blah blah blah test' –

+6

Potrei mancare il punto, ma sicuramente non stai davvero facendo un 'mi piace' ma un 'uguale' .... Dove (x => x.Name.Equals ("test"); –

+0

È proprio come @ n3rd ha detto. –

22

Anche se questo è stato contrassegnato come risolto, che era corrette al momento , posso anche notare che NHibernate ha alcune estensioni ora in modo da poter fare quanto segue:

Session.QueryOver<MyEntity>() 
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere)) 
    .List(); 

Thi s farà un LIKE '%something%' per te.

+1

Questi sono out-the-box, a proposito, non costruiti su misura – Kezzer

+0

+1 esattamente quello che stavo cercando per, potrebbe valere la pena notare di risolvere il problema esatto sopra che vorresti usare MatchMode.Exact (senza% jolly) – PJUK

+0

Dovevi aggiungere un 'usando NHibernate.Criterion;' quando non utilizzi Resharper. Funziona alla grande! Grazie. –