Quiza por alguna razon o por que desees hacer una prueba de Concepto desees realizar una conversion de LINQ Table a una Data table. Pue bien primero deberas crear una clase que enumere en tiempo de ejecucion las filas que trae tu LINQ table, este es el codigo para realizar dicha funcionalidad.
Imports System.Reflection
Public Class LinqToTable
»’ <summary>
»’ Description: This Method converts LINQ Table to System.Data.DataTable
»’ Date : 28/6/2008
»’ Revisions : Emilio Vicente Martinez Vazquez
»’ </summary>
»’ <param name=»IEObject»></param>
»’ <returns></returns>
»’ <remarks></remarks>
Public Function ObtainDataTableFromIEnumerable(ByVal IEObject As System.Collections.IEnumerable) As DataTable
Dim dtMyTable As New DataTable()
For Each objObject As Object In IEObject
Dim MyType As Type = objObject.[GetType]()
Dim pInfoType As PropertyInfo() = MyType.GetProperties()
If dtMyTable.Columns.Count = 0 Then
For Each pInfo As PropertyInfo In pInfoType
dtMyTable.Columns.Add(pInfo.Name, pInfo.PropertyType)
Next
End If
Dim drMyRow As DataRow = dtMyTable.NewRow()
For Each pInfo As PropertyInfo In pInfoType
Dim value As Object = pInfo.GetValue(objObject, Nothing)
drMyRow(pInfo.Name) = value
Next
dtMyTable.Rows.Add(drMyRow)
Next
Return dtMyTable
End Function
End Class
Ahroa deberas agregar a tu proyecto un objeto de tipo linq to sql class (boton derecho en alguna carpeta que nombres «linq models» y le das agregar nuevo elemento y ahi veras linq to sql classes) Ahora bien dentro del modelo agrega el procedimiento almacenado que trae tus datos (supongamos para este ejemplo que buscaremos a los usuarios por su nombre asi que agregaremos dicho procedimiento almacenado al disenador de nuestro modelo de linq to sql classes)
Ahora deberas crear una funcion que haga la conversion de linq data table a un Data Table normal usando la clase que ya escribimos anteriormente. Dicha funcion quedaria mas o menos asi.
Public Function GetUserByName(ByVal strUser As String) As DataTable
Dim dtMyTable As DataTable = Nothing
Try
Dim dbCont As New MyLinQModel.MyLinQModelDataContext
Dim myProc As IEnumerable(Of getUser_Users_SResult) = dbCont.getUser_Users_S(strUser)
Dim myRes As New LinqToTable
dtMyTable = myRes.ObtainDataTableFromIEnumerable(myProc)
Catch ex As Exception
LogError.WriteFile(ex.ToString)
End Try
Return dtMyTable
Y Listo!! con esto ya convertiremos un LINQ Table a un Objeto de tipo Data Table.
Saludos!
End Function
Excelente artículo, pero … la rutina falla cuando se encuentra con un tipo que sea Nullable. Aunque de forma un poco ‘chapuza’, lo he arreglado así:
Dim dtMyTable As New DataTable()
Dim Columna As DataColumn = Nothing
For Each objObject As Object In IEObject
Dim MyType As Type = objObject.[GetType]()
Dim pInfoType As PropertyInfo() = MyType.GetProperties()
If dtMyTable.Columns.Count = 0 Then
For Each pInfo As PropertyInfo In pInfoType
‘dtMyTable.Columns.Add(pInfo.Name, pInfo.PropertyType)
If pInfo.PropertyType.Name.StartsWith(«Nullable») Then
Columna = New DataColumn(pInfo.Name, System.Type.GetType(«System.Object»))
Else
Columna = New DataColumn(pInfo.Name, pInfo.PropertyType)
End If
Columna.AllowDBNull = True
Columna.Caption = pInfo.Name
dtMyTable.Columns.Add(Columna)
Next pInfo
End If
Dim drMyRow As DataRow = dtMyTable.NewRow()
For Each pInfo As PropertyInfo In pInfoType
Dim value As Object = pInfo.GetValue(objObject, Nothing)
drMyRow(pInfo.Name) = value
Next pInfo
dtMyTable.Rows.Add(drMyRow)
Next objObject
Return dtMyTable
ESto es lo padre de los posts, siempre hay algo que mejorar. Saludos!