2010-07-06 7 views
2

J'ai 2 bases de données de différents serveurs. Je ne peux pas lier les bases de données. Les données sont extraites des bases de données:Linq aux objets

DB1

- Client_ID Engagement_ID Activé Description de

  • 600 10 Vrai Company1
  • 600 20 de Company2 Faux
  • 700 10 Vrai Société3

DB2

  • Client_ID Engagement_ID Activé Description de

  • 600 5 vrai Company1

  • 600 10 Faux Company2

  • 500 30 Vrai Company3

Le T SQL pour cette tâche est la suivante:

select * from DB1 
left join DB2 on DB1.client_ID = DB2.client_ID 
and DB1.Engagement_ID = DB2.Engagement_ID 
where DB2.CLient_ID is null 
and DB2.Engagement_ID is null and DB1.client_id in (select client_id from DB2) 

que je dois faire ce VB.NET LINQ

+0

s'il vous plaît don N'incluez pas de balises comme "VB.NET" dans le titre. Laissez-les simplement dans les tags. –

Répondre

0
Dim list1 = From obj1 As DBObject In DB1 _ 
        Group Join obj2 As DBObject In DB2 _ 
        On obj1.ClientId Equals obj2.ClientId _ 
        And obj1.EngagementId Equals obj2.EngagementId _ 
        Into g = Group _ 
        From r In g.DefaultIfEmpty() _ 
        Where g.ElementAtOrDefault(0) Is Nothing _ 
        Select New With {.Cl_ID = obj1.ClientId, .EngID = bj1.EngagementId} 


    Dim list2 = (From obj3 In list1 _ 
        From obj4 In DB2 _ 
        Where obj3.Cl_ID = obj4.ClientId _ 
        Select obj3).Distinct.DefaultIfEmpty 

J'ai modifié le code de sunpech et List2 contient le résultat attendu à savoir la deuxième rangée de DB1 - 600, 20, Faux, "Company2"

1

Les données de l'échantillon que vous avez fournies ne renvoyaient pas de valeur de toute façon, car ils clientId et EngagementId ont tous des valeurs.

Je divise le LINQ en deux listes. Je n'ai pas encore testé ou optimisé cela, mais c'est peut-être ce que vous cherchez pour au moins vous aider à démarrer.

Voici ma tentative:

Public Class DBObject 

    Public Sub New(ByVal cId As Integer, _ 
        ByVal eId As Integer, _ 
        ByVal enabled As Boolean, _ 
        ByRef desc As String) 

     _clientId = cId 
     _engagementId = eId 
     _enabled = enabled 
     _description = desc 

    End Sub 

    Private _clientId As Integer 
    Public Property ClientId() As Integer 
     Get 
      Return _clientId 
     End Get 
     Set(ByVal value As Integer) 
      _clientId = value 
     End Set 
    End Property 

    Private _engagementId As Integer 
    Public Property EngagementId() As Integer 
     Get 
      Return _engagementId 
     End Get 
     Set(ByVal value As Integer) 
      _engagementId = value 
     End Set 
    End Property 

    Private _enabled As Boolean 
    Public Property Enabled() As Boolean 
     Get 
      Return _enabled 
     End Get 
     Set(ByVal value As Boolean) 
      _enabled = value 
     End Set 
    End Property 

    Private _description As String 
    Public Property Description() As String 
     Get 
      Return _description 
     End Get 
     Set(ByVal value As String) 
      _description = value 
     End Set 
    End Property 

End Class 

Dim DB1 As New List(Of DBObject) 
Dim DB2 As New List(Of DBObject) 

DB1.Add(New DBObject(600, 10, True, "Company1")) 
DB1.Add(New DBObject(600, 20, False, "Company2")) 
DB1.Add(New DBObject(700, 10, True, "Company3")) 

DB2.Add(New DBObject(600, 5, True, "Company1")) 
DB2.Add(New DBObject(600, 10, False, "Company2")) 
DB2.Add(New DBObject(500, 30, True, "Company3")) 

Dim list1 As List(Of DBObject) = (From obj1 As DBObject In DB1 _ 
             Join obj2 As DBObject In DB2 _ 
             On obj1.ClientId Equals obj2.ClientId _ 
             And obj1.EngagementId Equals obj2.EngagementId _ 
             Where obj2.ClientId = Nothing _ 
             And obj2.EngagementId = Nothing _ 
             Select obj1).ToList 

Dim list2 As List(Of DBObject) = (From obj3 As DBObject In list1 _ 
              From obj4 As DBObject In DB2 _ 
              Where obj3.ClientId = obj4.ClientId _ 
              Select obj3).ToList 

' list2 would have the results you desire 
+0

Merci pour votre réponse. Mon SQL fonctionne et il renvoie le deuxième enregistrement de DB1 - 600 20 False Company2 car l'ID client 600 est présent dans DB2 et l'identifiant d'engagement 20 n'est pas présent dans DB2. J'ai essayé votre code mais il ne retourne rien. C'est parce que vous avez utilisé une jointure pour list1. Nous avons besoin d'une jointure à gauche pour list1. J'essaye de converger la jointure à une jointure gauche. Merci encore. –

+0

J'ai changé la requête LINQ et cela fonctionne. Merci de votre aide. –