Left Join Linq

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 579 fois - Téléchargée 22 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

Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1
Merci pour vos commentaires, et les étoiles
Merci pour le GroupJoin mais ça ne semble pas exister sur ma version de visual studio
cordialement
Messages postés
14771
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 septembre 2020
433 >
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014

Bonjour, regarde ici, les exemples sont en C#, mais c'est transposable en VB.Net
Messages postés
21
Date d'inscription
samedi 9 août 2014
Statut
Membre
Dernière intervention
30 août 2014

Merci pour ton aide je met ça de coté ;) peace
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

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.