2009-11-06 12 views
22

¿Cómo puedo generar esta consulta utilizando NHibernate.Linq?NHibernate.Linq LIKE

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

Tenga en cuenta que esto no es Linq To Sql o Entity Framework. Esto es NHibernate.

Editar:

Ésta es la consulta deseada utilizando ICriteria:

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

Respuesta

6

Con NH4 (y probablemente un poco antes), una extensión integrada Like cadena está disponible dentro de NHibernate.Linq espacio de nombres: Like(this string matchExpression, string sqlLikePattern). (Se define la clase NHibernate.Linq.SqlMethods extensión.)

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

Creo que esto es lo que busca:

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

Según mis pruebas que genera una instrucción SQL 'LIKE': "... WHERE theater.Name LIKE% test%"

que es exactamente el resultado del fragmento de criterios que ha proporcionado.

+1

mediante criterios (siempre en la pregunta), no estoy viendo los comodines% que se generan. – mxmissile

+0

Acabo de ejecutar la prueba unitaria que tengo con el código provisto en mi respuesta y produjo una declaración SQL con el comodín% en ambos extremos en la cadena de caracteres. También realizo la misma prueba usando el Equilevant de Criteria y obtengo la misma declaración SQL exactamente si uso criteria.Add (Expression.Like ("Name", "test", MatchMode.Anywhere)); Uso NHibernate 2.1 con SQL Server 2005. Si está utilizando la misma configuración, entonces debería poder ver los mismos resultados. – tolism7

+0

El problema es que no quiero que los comodines usen Linq. Mi comentario anterior respondía a su respuesta "exactamente el resultado del fragmento de criterios que ha proporcionado". Lo siento si no estaba claro. Puedo lograr la consulta deseada con ICriteria como se indica en la Pregunta, pero no puedo lograrlo utilizando Linq. – mxmissile

15

que tenían el mismo problema en mi proyecto y encontró una solución:

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

Esto se traduce en SQL para

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

Además: '&& x.Name.Length ==" test ".Length'. de lo contrario, terminarías con resultados como 'test blah blah blah test' –

+6

Me puede estar faltando el punto, pero seguramente no estás realmente haciendo un 'me gusta' sino un 'igual' ... .Dónde (x => x.Name.Equals ("test"); –

+0

De hecho, como dijo @ n3rd. –

22

Si bien esto se ha marcado como resuelto, que era correcta en el momento , también puedo señalar que NHibernate tiene algunas extensiones ahora para que pueda hacer lo siguiente:

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

Thi s hará un LIKE '%something%' para usted.

+1

Estos son, por cierto, out-the-box, no personalizados. – Kezzer

+0

+1 exactamente lo que estaba buscando para, podría valer la pena señalar para resolver el problema exacto anterior que desea utilizar MatchMode.Exact (no% wildcard) – PJUK

+0

Tuve que agregar un 'using NHibernate.Criterion;' cuando no se usa Resharper. Pero funciona muy bien! Gracias. –