none
LINQ me devuelve solo el primer registro repetido... RRS feed

  • Pregunta

  • Hola amigos! Estoy leyendo de una vista (VW_POSIZIONE_L2) que contiene mas o menos (para no perder tiempo con toda la estructura) los siguientes campos: (IdPosicion int, IdPeriodo int, [...]). Estoy desarrollando una aplicación con ASP.NET MVC 5 y mi problema es, que en el Controller he escrito la siguiente expresión lambda en un ActionResult:

    // Aqui detallePerido es un ViewModel que tiene referencias a varias tablas o vistas.
    var detallePeriodo = new PeriodoViewModel();

    detallePeriodo.VPosizioneL2 = db.VW_POSIZIONE_L2.Where(p => p.Id_Periodo == id).OrderByDescending(p => p.Id_Posizione).ToList();

    // Que sería lo mismo que ejecutar esto otro código con LINQ...
    // detallePeriodo.VPosizioneL2 = (from p in db.VW_POSIZIONE_L2
    //                                              where p.Id_Periodo == id
    //                                              orderby p.Id_Posizione descending
    //                                              select p).ToList();

    return View(detallePeriodo);

    El problema es que me devuelve un resultado de n filas (que satisfacen la condición de IdPeriodo), pero solo obtiene el primer registro, repetido las n veces. Sin embargo si ejecuto la misma consulta en la consola de Administración de MS SQL SERVER, la consulta me devuelve correctamente los datos. ¿Qué estoy haciendo mal... o que puede estar sucediendo?

    jueves, 23 de enero de 2020 9:08

Todas las respuestas

  • ¿Lo has comprobado con el debugger, parando la ejecución sobre esa línea y verificando qué es lo que hay dentro del List?

    Lo digo porque si únicamente estás mirando la Vista y ves en ella el registro duplicado, puede ser que el error se encuentre dentro del bucle escrito en la vista para iterar sobre el modelo. Antes de decidir que el error "sí está ahí" o "no está ahí", sería bueno verificar con el debugger qué es lo que realmente está devolviendo la consulta.

    jueves, 23 de enero de 2020 9:35
  • Hola amigo!

    Si, lo he comprobado con el debugger mil veces. Incluso, la misma instrucción la utilizo para otras vistas y me devuelve los registros correctamente. Pensaba que la vista tenía algún problema, pero es que si ejecuto la misma consulta en la Consola de SQL SERVER funciona correctamente y me devuelve todos los registros. Lo único que me llama la atención, es que esa vista la generó el asistente de scalfolding de EF; y cuando la creó, al campo IdPosizione le asignó la propiedad NULLABLE (no sé porqué). El error no pienso que esté en el ciclo For.

    Te explico mejor. En la vista, IdPeriodo se repite n veces y cada registro tiene un IdPosizione diferente, pues todas las posiciones se corresponden con un Periodo. Yo estoy pasando el id del Periodo que deseo filtrar y por ejemplo, si paso el ID=80, cuando "debuggo", observo el contenido del objecto detallePeriodo.VPosizioneL2 y la lista esta llena con solo con los datos del primer registro, repetidos las n veces que existe el IdPeriodo. ¡Ese es exactamente el problema! A este punto aún no he hecho el recorrido con el For. 

    jueves, 23 de enero de 2020 9:48
  • Se que es un poco extraño lo que sucede aqui... pero detallo un poco mas clara la situación. Observen este ejemplo:

    IdPosizione        IdPeriodo          [... Otros campos...]

    1                      3                      ...

    2                      3                      ...

    3                      6                      ...

    Si filtro esos datos por el IdPeriodo = 3, por ejemplo. La Consulta me debe devolver los dos primeros registros cuyos IdPosizione son iguales a 1 y 2. Ahora bien, si ejecuto la consulta antes mencionada, me devuelve 2 registros, pero SOLO ES EL PRIMERO, REPETIDO 2 VECES. ¡NO ENTIENDO QUE PUEDE ESTAR SUCEDIENDO! Si ejecuto la misma instrucción en la Consola de SQL SERVER, el resultado es correcto. Igual es correcto si ejecuto la instrucción con otras vistas.

    jueves, 23 de enero de 2020 9:53
  • Gracias por tu respuesta amigo! El error ya esta ocurriendo en el Controller... aún no se ha cargado la vista en este punto. Yo solo he puesto un punto de interrupción en la linea donde se ejecuta la consulta y por ejemplo, veo que el objeto 'detallePeriodo.VPosizioneL2'está lleno, con 183 valores (que son los registros que realmente se corresponden al IdPeriodo pasado como parámetro. Pero como ya les expliqué antes, los 183 registros, son el primero, repetido n veces.
    jueves, 23 de enero de 2020 10:02
  • Si ya tenias esta pregunta abierta, porque creaste una nueva

    LINQ me devuelve solo el primer registro de la consulta repetido n veces...

    de esta forma se complica darle seguimiento

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 23 de enero de 2020 14:48