我正在尝试在两个数据表之间执行左连接,这两个数据表将返回左表中的所有记录,而在连接条件的右表中没有相应的值。截至目前,我有以下几点没有返回任何内容:
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 中看起来要复杂得多。
答案 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