sqlquery query linq nhibernate linq-to-nhibernate

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 y StartsWith mapa al operador LIKE 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.