Left Join Linq

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 698 fois - Téléchargée 24 fois

Contenu du snippet

'Bonjour,
'je vous propose une class permettant de faire un left join entre deux datatable
'j'ai trouvé une solution qui fonctionne mais il y a surement mieux
'Je poste ici ce code car il y a beaucoup de recherche sur google pour ce genre de chose

'n'hésitez pas à faire des proposition d'amélioration

Public Class joinTables
        Private FirstTab As DataTable, SecondTable As DataTable, Champ1 As String, Champ2 As String
        Private Cols1 As List(Of String), Cols2 As List(Of String)
        Private RDTab As DataTable

        Public Sub New(_FirstTab As DataTable, _SecondTable As DataTable, _Champ1 As String, _Champ2 As String)
            FirstTab = _FirstTab
            SecondTable = _SecondTable
            Champ1 = _Champ1
            Champ2 = _Champ2
            Cols1 = New List(Of String)
            Cols2 = New List(Of String)
            RDTab = New DataTable
            For Each Col As DataColumn In FirstTab.Columns
                Cols1.Add(Col.ColumnName)
                RDTab.Columns.Add(New DataColumn(Col.ColumnName, Col.DataType, Col.Expression))
            Next
            For Each Col As DataColumn In From _Col As DataColumn In SecondTable.Columns.OfType(Of DataColumn)() Where Not Cols1.Contains(_Col.ColumnName)
                Cols2.Add(Col.ColumnName)
                RDTab.Columns.Add(New DataColumn(Col.ColumnName, Col.DataType, Col.Expression))
            Next
        End Sub

        Public Function leftJoin() As DataTable
            Dim query = (From FRow As DataRow In FirstTab.Rows.OfType(Of DataRow)() _
                        Group Join SRow As DataRow In SecondTable.Rows.OfType(Of DataRow)() _
                        On FRow(Champ1) Equals SRow(Champ1) And FRow(Champ2) Equals SRow(Champ2) _
                        Into G = Group _
                        From GRow As DataRow In G.DefaultIfEmpty
                        Select getNewRow(FRow, GRow))
            Dim Q = From Row In query _
                    Group By C1 = Row(Champ1), C2 = Row(Champ2) _
                    Into G = Group
                    Let first = G.First
                    Select first
            Return New DataTable(Q.OfType(Of DataRow)().CopyToDataTable())
        End Function

        Private Function getNewRow(Row1 As DataRow, Row2 As DataRow) As DataRow
            Dim R As DataRow = RDTab.addRow
            Try
                If Row1 IsNot Nothing Then
                    For Each Col As String In Cols1
                        R(Col) = Row1(Col)
                    Next
                End If
                If Row2 IsNot Nothing Then
                    For Each Col As String In Cols2
                        R(Col) = Row2(Col)
                    Next
                End If
            Catch ex As Exception
                addError(ex)
            End Try
            Return R
        End Function

        Public Function Join() As DataTable
                Dim query = (From FRow As DataRow In FirstTab.Rows.OfType(Of DataRow)() _
                        Join SRow As DataRow In SecondTable.Rows.OfType(Of DataRow)() _
                        On FRow(Champ1) Equals SRow(Champ1) And FRow(Champ2) Equals SRow(Champ2) _
                        Select getNewRow(FRow, SRow))
                Dim Q = From Row In query _
                        Group By C1 = Row(Champ1), C2 = Row(Champ2) _
                        Into G = Group
                        Let first = G.First
                        Select first
                Return New DataTable(Q.OfType(Of DataRow)().CopyToDataTable())
        End Function
    End Class

    Public Class joinTables1
        Private FirstTab As DataTable, SecondTable As DataTable, Champ1 As String
        Private Cols1 As List(Of String), Cols2 As List(Of String)
        Private RDTab As DataTable

        Public Sub New(_FirstTab As DataTable, _SecondTable As DataTable, _Champ1 As String)
            FirstTab = _FirstTab
            SecondTable = _SecondTable
            Champ1 = _Champ1
            Cols1 = New List(Of String)
            Cols2 = New List(Of String)
            RDTab = New DataTable
            For Each Col As DataColumn In FirstTab.Columns
                Cols1.Add(Col.ColumnName)
                RDTab.Columns.Add(New DataColumn(Col.ColumnName, Col.DataType, Col.Expression))
            Next
            For Each Col As DataColumn In From _Col As DataColumn In SecondTable.Columns.OfType(Of DataColumn)() Where Not Cols1.Contains(_Col.ColumnName)
                Cols2.Add(Col.ColumnName)
                RDTab.Columns.Add(New DataColumn(Col.ColumnName, Col.DataType, Col.Expression))
            Next
        End Sub

        Public Function leftJoin() As DataTable
            Dim query = (From FRow As DataRow In FirstTab.Rows.OfType(Of DataRow)() _
                        Group Join SRow As DataRow In SecondTable.Rows.OfType(Of DataRow)() _
                        On FRow(Champ1) Equals SRow(Champ1) _
                        Into G = Group _
                        From GRow As DataRow In G.DefaultIfEmpty
                        Select getNewRow(FRow, GRow))
            Dim Q = From Row In query _
                    Group By C1 = Row(Champ1) _
                    Into G = Group
                    Let first = G.First
                    Select first
            Return New DataTable(Q.OfType(Of DataRow)().CopyToDataTable())
        End Function

        Public Function Join() As DataTable
            Dim query = (From FRow As DataRow In FirstTab.Rows.OfType(Of DataRow)() _
                        Join SRow As DataRow In SecondTable.Rows.OfType(Of DataRow)() _
                        On FRow(Champ1) Equals SRow(Champ1) _
                        Select getNewRow(FRow, SRow))
            Dim Q = From Row In query _
                    Group By C1 = Row(Champ1) _
                    Into G = Group
                    Let first = G.First
                    Select first
            Return New DataTable(Q.OfType(Of DataRow)().CopyToDataTable())
        End Function

        Private Function getNewRow(Row1 As DataRow, Row2 As DataRow) As DataRow
            Dim R As DataRow = RDTab.addRow
            Try
                If Row1 IsNot Nothing Then
                    For Each Col As String In Cols1
                        R(Col) = Row1(Col)
                    Next
                End If
                If Row2 IsNot Nothing Then
                    For Each Col As String In Cols2
                        R(Col) = Row2(Col)
                    Next
                End If
            Catch ex As Exception
                addError(ex)
            End Try
            Return R
        End Function
    End Class

Compatibilité : 1

A voir également

Ajouter un commentaire Commentaires
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
21 août 2014 à 08:01
Merci pour vos commentaires, et les étoiles
Merci pour le GroupJoin mais ça ne semble pas exister sur ma version de visual studio
cordialement
Whismeril Messages postés 18607 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 23 septembre 2023 629 > cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014
21 août 2014 à 09:12
Bonjour, regarde ici, les exemples sont en C#, mais c'est transposable en VB.Net
LeiiNats.DEV Messages postés 21 Date d'inscription samedi 9 août 2014 Statut Membre Dernière intervention 30 août 2014
20 août 2014 à 17:28
Merci pour ton aide je met ça de coté ;) peace
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
20 août 2014 à 15:47
Je fait mes Left Join en Linq avec GroupJoin
as-tu essayé ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.