none
Problema con replace en NHibernate RRS feed

  • Pregunta

  • Buenas amigos.

    Estoy intentando hacer una cosa que en teóricamente debería ser muy sencilla pero me está dando muchos problemas. Estoy haciendo una consulta a base de datos con NHibernate, y lo que quiero es conseguir coincidencias "parecidas". Es decir, quiero que el usuario introduzca un nombre y comprobar si ya existe en la BD. Para ello quiero eliminar los acentos de las vocales, tanto las introducidas por el usuario, como las que ya están en BD. Es decir, si en la BD hay un JOSÉ y el usuario introduce JOSE, o JÓSE o JÓSÉ, quiero que coincida. Para ello utilizo la siguiente consulta

    Return Session.QueryOver(Of PersonaEntity)() _
                                .Where(Function(p) p.Nombre.Upper().Replace("É", "E") = nombre.Replace("Á", "A").Replace("É", "E").Replace("Í", "I").Replace("Ó", "O").Replace("Ú", "U").Replace("Ü", "U")) _
                                .And(Function(p) p.Apellido1.Upper() = apellido1.Replace("Á", "A").Replace("É", "E").Replace("Í", "I").Replace("Ó", "O").Replace("Ú", "U").Replace("Ü", "U")) _
                                .Take(1) _
                                .FutureValue.Value()

    En este ejemplo, para la persona de la bd solo hago el replace de la E, porque estoy probando, pero la cuestión es que esto me da el siguiente error:

    El código de usuario no controló InvalidOperationExceptiopn - variable 'p' of type 'Entity.PersonaEntity' referenced from scope '', but it is not defined.

    Este error es por culpa del replace de -> "p.Nombre.Upper().Replace(...)" porque si lo quito, obviamente no encuentra las coincidencias en ciertos casos, pero no da error.

    ¿Alguna solución o aclaración?. Espero vuestras respuestas.

    Salu2!!


    Jose Alberto Marti

    martes, 4 de agosto de 2015 7:30

Respuestas

Todas las respuestas

  • Sé que no tiene nada que ver con el error pero para comparar las cadenas puedes utilizar string.Compare:

    Return Session.QueryOver(Of PersonaEntity)() _
      .Where(Function(p) String.Compare(p.Nombre, nombre, CultureInfo.InvariantCulture, CompareOptions.IgnoreCase Or CompareOptions.IgnoreNonSpace) = 0 _
        AndAlso String.Compare(p.Apellido1, apellido1, CultureInfo.InvariantCulture, CompareOptions.IgnoreCase Or CompareOptions.IgnoreNonSpace) = 0) _
      .Take(1) _
      .FutureValue.Value()


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 8:02
  • Hola Asier,

    Me da el mismo error con ese método. Según entiendo yo, por lo que he probado y he visto por ahí, si intentas utilizar funciones de las librerías normales de .net con objetos que son de la parte de NHibernate y no son de las librerías de NHibernate, falla. Por ejemplo, la función p.Nombre.ToUpper() me da el error que he puesto, sin embargo, p.Nombre.Upper() no lo da, porque esa función sí es de las librerías de NHibernate.

    De todas formas, gracias por la respuesta.

    ¿Algunas otra idea?


    Jose Alberto Marti

    martes, 4 de agosto de 2015 8:30
  • Sí, parece que no es tan sencillo.

    Mira a ver si esto te puede servir:

    NHibernate String Comparison

    Accent insensitive on NHibernate and SqlServer


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 9:17
  • Hola Asier,

    Posiblemente la solución al problema sea crear alguna función a proposito que haga lo que yo quiero, pero por falta de tiempo voy a optar por crearme una vista con esos campos ya modificados mediante SQL y consultar esa vista.

    Dejaré la pregunta abierta un tiempo por si a alguien más se le ocurre algo, y luego marcaré tu respuesta como correcta.

    Gracias por la ayuda.


    Jose Alberto Marti

    martes, 4 de agosto de 2015 10:46