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

 

 

Escribe tu log de errores en un archivo.

Si por alguna razon tienes la necesidad de escribir los errores que genera tu aplicacion en un archivo .txt este codigo puede ser de utilidad.

 

Public Class LogError

#Region «Write To HD Functions»

    »’ <summary>
    »’ Description: Write to Hd the Errors
    »’ Date       : 26/2/2007
    »’ Revisions  : Emilio Vicente Martinez Vazquez
    »’ </summary>
    »’ <param name=»Text»></param>
    »’ <remarks></remarks>
    Public Shared Sub WriteFile(ByVal Text As String)
        Dim strStream As System.IO.Stream
        Dim strStreamWriter As System.IO.StreamWriter = Nothing
        Dim strStreamReader As System.IO.StreamReader = Nothing
        Dim str As String = Nothing

        Try

            Dim FilePath As String = AppDomain.CurrentDomain.BaseDirectory.ToString() + «SurveyLog.txt»

            If System.IO.File.Exists(FilePath) = True Then
                strStreamReader = System.IO.File.OpenText(FilePath)
                str = strStreamReader.ReadToEnd()
                strStreamReader.Close()
            End If

            strStream = System.IO.File.OpenWrite(FilePath)
            strStreamWriter = New System.IO.StreamWriter(strStream, _
                             System.Text.Encoding.UTF8)

            If str = «» Then
                strStreamWriter.WriteLine(DateTime.Now.ToString)
                strStreamWriter.WriteLine(Text)
            Else

                str = str + Text
                strStreamWriter.WriteLine(str)
                strStreamWriter.WriteLine(DateTime.Now.ToString)
                strStreamWriter.WriteLine(» «)
                strStreamWriter.WriteLine(» «)
                strStreamWriter.WriteLine(» «)
            End If

            strStreamWriter.Close()

        Catch ex As Exception
            strStreamWriter.Close()
            strStreamReader.Close()
        End Try
    End Sub
#End Region
   
End Class