linq - sqlquery - nhibernate sql query string
¿NHibernate LINQ es compatible con ToLower() en cláusulas Where()? (4)
De acuerdo con los comentarios en estas dos publicaciones del blog , esta funcionalidad aún no está implementada .
Tengo una entidad y su mapeo:
public class Test
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
public class TestMap : EntityMap<Test>
{
public TestMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
}
}
Estoy intentando ejecutar una consulta sobre él (para extraerlo de la base de datos):
var keyword = "test" // this is coming in from the user
keyword = keyword.ToLower(); // convert it to all lower-case
var results = session.Linq<Test>
.Where(x => x.Name.ToLower().Contains(keyword));
results.Count(); // execute the query
Sin embargo, siempre que ejecuto esta consulta, obtengo la siguiente excepción:
Index was out of range. Must be non-negative and less than the size of the
collection. Parameter name: index
¿Tengo razón cuando digo que, actualmente, Linq a NHibernate no es compatible con ToLower()
? Y si es así, ¿hay alguna alternativa que me permita buscar una cadena en el medio de otra cadena con la que sea compatible Linq a NHibernate? Por ejemplo, si el usuario busca kap
, necesito que coincida con Kapiolani
, Makapuu
y Lapkap
.
Es posible que desee confirmar si la base de datos usa la distinción entre mayúsculas y minúsculas.
Si no es así, entonces no necesita .ToLower ()
Esto sucedió hace poco. Puedo decirle que ToLower () no funciona y que Contiene () y StartsWith () funcionan y no distinguen entre mayúsculas y minúsculas. Puede obtener el efecto deseado al usar Contains () y StartsWith () directamente.
Parece haber mucha confusión sobre este tema.
- El "viejo" proveedor de Linq (para NHibernate 2.x) probablemente no sea compatible con esto. Si ese es el caso, nunca lo hará porque ya no se mantiene.
- El nuevo proveedor (incluido con NHibernate 3.x) sí lo admite (aunque ToUpper y ToLower parecen estar invertidos, consulte http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241 )
-
Contains
yStartsWith
mapa al operadorLIKE
en SQL. Ellos no son sensibles a las mayúsculas; es la intercalación que los hace insensibles a las mayúsculas y minúsculas, por lo que depende de cómo se haya creado su columna / esquema.
Actualización (2010-04-09): error confirmado y parche enviado, consulte https://nhibernate.jira.com/browse/NH-2169
Actualización (2010-05-21): el parche se aplicó el 2010-05-01 y funciona como se espera ahora.