none
Query de una Clase RRS feed

  • Pregunta

  • Buenos dias, os comento el problema que tengo. Quiero hacer una query llamando a una clase. Es decir, yo quiero hacer una query de una tabla y a la vez convertirla en un objeto de mi clase. Para ello yo tengo definida mi clase de la siguiente forma:

    Public Class Reserva
    
      Private _Reserva As Data.Reserva
          
    Public Property Reserva() As Data.Reserva Get Return _Reserva End Get Set(ByVal value As Data.Reserva) _Reserva = value End Set End Property Private _Fase As Fases Public Property NewProperty() As Fases Get Return _Fase End Get Set(ByVal value As Fases) _Fase = value End Set End Property Public Sub New() End Sub Public Sub New(ByRef rsv As Data.RSV_Reservas) _Reserva = rsv _Fase = getFase() End Sub Private Function getFase() As Fases Return Fases.ERROR End Function End Class


    Y desde donde la llamo:

     Dim result As IQueryable(Of Logic.Reservas.Reserva) = Nothing
     result = (From elm In db.Reservas Select New Logic.Reservas.Reserva(elm)).AsQueryable
    


    Y me sale este error, "Only parameterless constructors and initializers are supported in LINQ to Entities". ¿Porque no puedo llamar al constructor de mi clase pasando un parametro? SI creo un constructor vacio funciona sin problema, pero claro... no es lo que busco.

     

    Gracias.

     

     

    • Tipo cambiado Makea86 martes, 24 de enero de 2012 14:08
    martes, 24 de enero de 2012 12:20

Todas las respuestas

  • Estás usando LINQ-to-Entities en lugar de LINQ-to-objects, por eso te sale el error del constructor, ya que LINQ-to-Entities no sabe traducir la llamada al constructor en una llamada a la base de datos.

    Una solución consiste en convertir la consulta en LINQ-to-Objects, por ejemplo interponiendo un .ToList para que la llamada al Entity Framework traiga los datos a memoria convirtiéndolos en un List. A partir de aqui, el Select ya no es un Select sobre IQueryable sino un Select sobre IEnumerable, y éste sí que sabe usar el constructor. Nótese que el IEnumerable no puede convertirse de vuelta en IQueryable, por lo que hay que cambiar el tipo de tu resultado:

    Dim result As IEnumerable(Of Logic.Reservas.Reserva)
    result = From elm In db.Reservas.ToList() Select New Logic.Reservas.Reserva(elm)<br/>
    
    Nota: No lo he probado, pero en teoría debería de funcionar.
    lunes, 30 de enero de 2012 18:49