Convertir LINQ Table a DataTable

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

 

 

2 comentarios en “Convertir LINQ Table a DataTable”

  1. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *