LINQ - 左连接以查找不匹配的记录

时间:2012-09-27 15:17:50

标签: vb.net linq

我正在尝试在两个数据表之间执行左连接,这两个数据表将返回左表中的所有记录,而在连接条件的右表中没有相应的值。截至目前,我有以下几点没有返回任何内容:

Dim Query1 = From exasset In dtExistingAssets _
             GroupJoin asset In dtNewAssets _
             On exasset("ACCOUNT_NAME") Equals asset("ACCOUNT_NAME") _
             Into results = Group _
             From f In results.DefaultIfEmpty _
             Where IsDBNull(f) _
             SelectNewWith _
             { //...

我看过几次使用Any的引用,但我无法正确使用语法。有人可以帮忙吗?这在SQL中很容易实现,但在 LINQ 中看起来要复杂得多。

2 个答案:

答案 0 :(得分:1)

我会使用类似Field的强类型DataRow扩展方法,它们也支持nullables。

Dim query = From exAsset In dtExistingAssets
        Group Join newAsset In dtNewAssets
        On exAsset.Field(Of String)("ACCOUNT_NAME") Equals newAsset.Field(Of String)("ACCOUNT_NAME") Into Group
        From joinedAssets In Group.DefaultIfEmpty()
        Where joinedAssets.Field(Of String)("ACCOUNT_NAME") Is Nothing

如果您只想了解新帐户,还可以使用高效的Enumerable.Except

Dim existingAccounts = From exRow In dtExistingAssets
                       Select exRow.Field(Of String)("ACCOUNT_NAME")
Dim newAccounts = From newRow In dtNewAssets
                       Select newRow.Field(Of String)("ACCOUNT_NAME")
Dim newAccNotInExisting = newAccounts.Except( existingAccounts )

答案 1 :(得分:1)

我认为问题是IsDBNull(f),左连接将导致空值(VB中为Nothing)而不是DBNull值。我认为你应该把它改成:``

...
From f In results.DefaultIfEmpty _
Where f is Nothing