0

2 つのデータテーブル間で左結合を実行しようとしています。これは、結合基準で右テーブルに対応する値を持たない左テーブルからすべてのレコードを返します。今のところ、何も返さない次のものがあります。

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 _
             { //...

using に関するいくつかの参照を見てきましたAnyが、正しい構文を取得できませんでした。誰でも助けてもらえますか?これは、SQL では非常に簡単に実行できますが、LINQではより複雑に見えます。

4

2 に答える 2

1

nullableもサポートするような強く型付けされたDataRow拡張メソッドを使用します。Field

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 )
于 2012-09-27T15:27:29.590 に答える
1

IsDBNull(f)問題は、左結合が値ではなくヌル値 ( NothingVB の場合)になることだと思いDBNullます。次のように変更する必要があると思います: ``

...
From f In results.DefaultIfEmpty _
Where f is Nothing
于 2012-09-27T16:48:45.907 に答える