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

  • 问题

  • 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?

    2020年1月23日 9:08

全部回复

  • ¿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.

    2020年1月23日 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. 

    2020年1月23日 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.

    2020年1月23日 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.
    2020年1月23日 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

    2020年1月23日 14:48
  • Hola, hace tiempo tuve el mismo problema al consultar con LINQ una tabla con mucha información en mi base de datos, analizando el problema, me di cuenta de que al consultar tablas con Primary Key, esto no sucede, mi solución fue, agregarle a la tabla con el problema una columna Id al final, declarar la columna como PK y agregarle un identity (1,1) para que se autoincrementara siempre que agregara un registro, espero que te pueda ayudar.

    ALTER TABLE [YOUR_TABLE]
    ADD [ID_TABLE] NUMERIC(16,0) NOT NULL IDENTITY(1,1) PRIMARY KEY;


    2022年6月17日 21:48