2010-04-08 21 views
13

Tengo una entidad y su mapeo:¿NHibernate LINQ es compatible con ToLower() en cláusulas Where()?

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 tratando de ejecutar una consulta en el mismo (a agarrarlo 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, cada vez que corro esta consulta, me sale el siguiente excepción:

Index was out of range. Must be non-negative and less than the size of the 
collection. Parameter name: index 

Estoy en lo cierto cuando digo que, en la actualidad, LINQ to NHibernate no apoya 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, lo necesito para que coincida con Kapiolani, Makapuu y Lapkap.

+0

¿Por qué crees que el problema está en la llamada a ToLower()? Es un método estándar definido en la clase String y no debería tener nada que ver con NHibernate LINQ. ¿En qué línea de la fuente de arriba obtienes la excepción? – Slavo

+1

En 'results.Count()', ya que es cuando se evalúa. Y tiene mucho que ver con Linq a NHibernate, ya que necesita convertirlo a SQL. –

+0

Ese proveedor de Linq es bastante viejo y no se ha actualizado por un tiempo. Podría funcionar, pero también podría probar con el proveedor de Linq más nuevo en el enlace de NHibernate. –

Respuesta

10

me había ocurrido esto recientemente. 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.

+0

Doh, no puedo creer que no haya notado que 'Contains()' y 'StartsWith()' no distinguen entre mayúsculas y minúsculas. ¡Perdí 5 horas ayer tratando de hacer que 'ToLower()' funcione cuando ya está implementado! –

1

Según el comments en estos dos blog posts esta funcionalidad es not implemented yet.

+0

Esa cadena de NHUsers Google Groups en realidad implica que funciona. –

+0

@Michael, no encontré ninguna evidencia en este hilo que sugiera que funciona. –

0

Es posible que desee confirmar si la base de datos usa la distinción entre mayúsculas y minúsculas.

Si no lo hace, entonces no es necesario .ToLower()

10

Parece haber mucha confusión sobre este tema.

  • El "antiguo" 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) hace apoyo que (aunque ToUpper y ToLower parecen estar invertidas, ver http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241)
  • Contains y StartsWith mapa para el operador LIKE en SQL. Son no case insensibles a sí mismos; 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 presentado parche, consulte https://nhibernate.jira.com/browse/NH-2169

actualización (2010-05-21): parche se aplicó en 2010-05-01 y funciona como se espera ahora .

+0

entonces, ¿qué versión tiene la solución? –

+0

@LouisRhys acaba de obtener la última estable. –

Cuestiones relacionadas