【问题标题】:Linq to objectsLinq 到对象
【发布时间】:2010-07-08 00:07:30
【问题描述】:

我有 2 个来自不同服务器的数据库。我无法链接数据库。数据从数据库中检索为:

DB1

- Client_ID Engagement_ID 启用说明

  • 600 10 真实公司1
  • 600 20 虚假公司2
  • 700 10 真正的公司3

DB2

  • Client_ID Engagement_ID 已启用 说明

  • 600 5 真公司1

  • 600 10 虚假公司2

  • 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

【问题讨论】:

  • 请不要在标题中包含“VB.NET”之类的标签。只需将它们留在标签中即可。

标签: vb.net linq-to-objects


【解决方案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

【讨论】:

  • 感谢您的回复。我的 SQL 正常工作,它从 DB1 - 600 20 False Company2 返回第二条记录,因为 DB2 中存在客户端 ID 600,而 DB2 中不存在参与 ID 20。我试过你的代码,但它什么也没返回。那是因为您使用了 list1 的连接。我们需要 list1 的左连接。我正在尝试将加入转换为左加入。再次感谢。
  • 我更改了 LINQ 查询并且它工作正常。感谢您的帮助。
【解决方案2】:
    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, False, "Company2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多