A veces es necesario obtener como resultado de una consulta LINQ una lista del tipo List(Of Clase1). LINQ genera listas de tipo anónimo, lo que en ocasiones no es util, investigando un poco pude resolver el problema de la siguiente manera.
Definir la función de conversión:
Private Shared Function CreateTypedList(Of T)(ByVal lista As List(Of T)) As List(Of Clase1)
Dim wLista As New List(Of Clase1)
If lista.Count > 0 Then
Dim _itemProperties() As PropertyInfo
For Each item As T In lista
_itemProperties = item.GetType().GetProperties()
Dim wField As New Clase1
For Each p As PropertyInfo In _itemProperties
wField(p.Name) = p.GetValue(item, Nothing)
Next
wLista.Add(wField)
Next
End If
Return wLista
End Function
esta recibe una lista de tipo anónimo y la convierte a una lista de objetos del tipo “Clase1″.
En este caso para poder realizar esta operación debemos indizar la clase ‘Clase1′, como sigue:
Public Class Clase1
Public Property Column1 As Int32
Public Property Column2 As Int32?
Public Property Column3 As Int32?
Public Property Saldo As Decimal?
Public Property Cantidad As Decimal
Public Property Obs As String
Default Public Property Item(ByVal name As String) As Object
Get
Select Case name
Case "Column1"
Return Column1
Case "Column2"
Return Column2
Case "Column3"
Return Column3
Case "Saldo"
Return Saldo
Case "Cantidad"
Return Cantidad
Case "Obs"
Return Obs
Case Else
Return Nothing
End Select
End Get
Set(ByVal Value As Object)
Select Case name
Case "Column1"
Column1= Convert.ToInt32(Value)
Case "Column2"
Column2 = Convert.ToInt32(Value)
Case "Column3"
Column3 = Convert.ToInt32(Value)
Case "Saldo"
Saldo = Convert.ToDecimal(Value)
Case "Cantidad"
Cantidad = Convert.ToDecimal(Value)
Case "Obs"
Obs = Convert.ToString(Value)
End Select
End Set
End Property
End Class
Su utilización en el siguiente ejemplo:
Private Shared Function [Select]() As List(Of Clase1)
Using _db As New SisEntities
Dim query = From t In _db.Tabla1
Join s In _db.Tabla2 On t.Cod1 Equals s.Cod1
Join i In _db.Tabla3 On t.Cod2 Equals i.Cod2
Where t.CodA = 1
Select New With {.Colum1 = t.Colum1,
.Colum2 = t.Colum2,
.Colum3 = s.Colum3,
.Saldo = 0,
.Cantidad = s.Cantidad,
.Obs = t.Obs}
For Each witem In query
witem.Saldo = Calcula_Saldo(witem.Colum1, witem.Colum2)
Next
Return CreateTypedList(query.ToList)
End Using
End Sub
la condición principal es que la lista generada sea equivalente a la “Clase1″.
No se si esta será la mejor forma o la más optima para realizar la conversión, pero funciona.