2010-07-06 67 views
2

我有来自不同服务器的2个数据库。我无法链接数据库。该数据是从数据库检索为:Linq到对象

DB1

- CLIENT_ID Engagement_ID说明已启用

  • 600 10真公司1
  • 600 20假Company2的
  • 700 10真Company3

DB2

  • CLIENT_ID Engagement_ID启用 说明

  • 600 5真公司1

  • 600 10假Company2的

  • 500 30真公司3

的T SQL此任务是:

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) 

我需要这样做VB.NET LINQ

+0

请不要在标题中不包含“VB.NET”等标签。只要将它们留在标签中即可。 – 2010-07-06 19:57:51

回答

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 

我修改sunpech的代码和List2包含即DB1的第二行预期的结果 - 600,20,假, “Company2的”

1

,因为他们的ClientID您提供将不返回任何值,反正样本数据和EngagementId都有价值。

我将LINQ分成两个列表。我还没有对此进行测试或优化,但这可能就是您要找的东西,至少可以帮助您入门。

这里是我的尝试:

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

感谢您的回复。我的SQL可以工作,并且它返回来自DB1-600 20 False Company2的第二条记录,因为客户端ID 600存在于DB2中,并且订约ID 20不存在于DB2中。我试过你的代码,但它什么都没有返回。那是因为你对list1使用了一个连接。我们需要list1的左连接。我正试图将连接转换为左连接。再次感谢。 – 2010-07-07 14:23:27

+0

我改变了LINQ查询,它工作。感谢您的帮助。 – 2010-07-07 15:51:28