none
Más de un resultado en una lectura que sólo debe devolver una RRS feed

  • Pregunta

  • Buenos días a todos:

    Estoy intentando aterrizar en esto de Entity FrameWork y tengo problemas de comprensión.

    Tengo un modelo donde incluyo varias tablas: Grupos, Aulas, GruposHorariosAulas, Cursos y Promociones. Todas relacionadas entre sí.

    Hago lo siguiente para recuperar un solo registro de la tablas de Grupos:

    Me.ctx = New cityEntities
    Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Load
    Me.Grupo = Me.ctx.Grupos.Single

    En la tercera linea me da un error: 

    System.InvalidOperationException: 'La secuencia contiene más de un elemento'

    Cundo reviso me.Grupo por el debuger, efectivamente hay mas de un registro cuando sólo debe haber uno. 

    Qué estoy haciendo mal?

    Gracias y un saludo.

    martes, 15 de mayo de 2018 6:01

Respuestas

  • Cuando llamas a Me.ctx.Grupos, se examina TODA la tabla Grupos (no tiene nada que ver el hecho de que previamente hayas llamado a Load con un Where que solo seleccione un registro para ese Load). Y, claro, cuando llamas a .Single da un error porque la tabla entera tiene mas de un registro.

    Pruebalo asi:

    Me.ctx = New cityEntities
    Me.Grupo = Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Single()

    • Marcado como respuesta ppito68 martes, 15 de mayo de 2018 17:11
    martes, 15 de mayo de 2018 13:40

Todas las respuestas

  • Cuando llamas a Me.ctx.Grupos, se examina TODA la tabla Grupos (no tiene nada que ver el hecho de que previamente hayas llamado a Load con un Where que solo seleccione un registro para ese Load). Y, claro, cuando llamas a .Single da un error porque la tabla entera tiene mas de un registro.

    Pruebalo asi:

    Me.ctx = New cityEntities
    Me.Grupo = Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Single()

    • Marcado como respuesta ppito68 martes, 15 de mayo de 2018 17:11
    martes, 15 de mayo de 2018 13:40
  • Hola Alberto, muchas gracias por contestar. 

    El problema es que no logro pillar bien la filosofía de EF, y la prueba es lo que tú dices. 

    El objetivo que tenia con .Load era obtener un BindinList para pasárselo a un BindingSource, y de esa forma conseguir editar y actualizar el origen de datos mediante el enlace a datos con controles, tal como se detalla en la definición de Form1 en el siguiente enlace, casi al final del texto.

    https://msdn.microsoft.com/en-us/library/jj682076(v=vs.113).aspx

    Siguiendo ese ejemplo, después de...

     Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Load (Lo que pongo en negrita es cosecha mía, pensando por error que en ctx.Grupos sólo quedaba un registro)

    ... quería seguir con ...

    me.GruposBindingSource.DataSource = Me.ctx.Grupos.Local.ToBindingList()

    Lo que me dices que usara:

    Me.Grupo = Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Single()

    no devuelve un bindingList, por eso no usaba esa sentencia. La idea era obtener un bindingList con un solo registro para pasarselo a un BindingSource.

    Me he manejado siempre con los DataSet, DataTable, etc, y ultimamente he tenido problemas con los tipados visitando los foros de msdn, leí los consejos que le daba un participante a otro para que migrara a EF, y por eso llevo una semana indagando el tema, pero entre que no domino LINQ y tampoco EF... ademas de que tengo un lío tremendo entre tantas opciones diferente que he visto para actualizar el origen de datos y cómo cargar y filtrar los registros...

    Muchas gracias nuevamente, Alberto.

    martes, 15 de mayo de 2018 17:11
  • Me.Grupo = Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Single()

    no devuelve un bindingList

    Efectivamente, al poner el .Single() lo que te devuelve es una única entidad, no un conjunto de entidades conteniendo un solo miembro. Espero que no tengas dificultad en comprender que no es lo mismo un elemento que un conjunto de elementos que solo contiene un elemento. El método ToBindingList solo es aplicable a los conjuntos de entidades, no a una entidad suelta.

    Si a partir de la tabla quieres obtener una lista con un solo elemento, el comando sería este:

    Me.Grupo = Me.ctx.Grupos.Where(Function(x) x.Id = idGrupo).Take(1)

    Aunque si ya sabes con seguridad que solamente un elemento puede cumplir el filtro (porque Id es la clave primaria), entonces puedes omitir el Take(1).

    martes, 15 de mayo de 2018 19:07
  • muchas gracias, Alberto.

    Un Saludo.

    martes, 15 de mayo de 2018 20:41