ホームページ >バックエンド開発 >C++ >「Join-on-Equals-Into」条項を使用せずにLINQで左外の結合を実行するにはどうすればよいですか?

「Join-on-Equals-Into」条項を使用せずにLINQで左外の結合を実行するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-02-02 14:21:08975ブラウズ

How Can I Perform a Left Outer Join in LINQ Without Using `join-on-equals-into` Clauses?

c#linq左外の結合:join-on-equals-into

の代替案

標準のないLINQに左外の結合を実装するjoin-on-equals-into構文は困難な場合があります。内側の結合には簡単な実装がありますが、左外の結合には別の戦略が必要です。 一般的な誤解を探り、それから正しいアプローチを探りましょう。

欠陥のある試み:

頻繁に、しかし間違ったアプローチのアプローチは、select句内で条件付き割り当てを使用して、左外の結合を模倣しようとします。

<code class="language-csharp">// Incorrect approach
List<JoinPair> leftFinal = (from l in lefts
                             from r in rights
                             select new JoinPair { 
                                            LeftId = l.Id, 
                                            RightId = (l.Key == r.Key) ? r.Id : 0 
                                        });</code>
このメソッドは、複数の一致する右側要素を備えた左側要素の複数のエントリを生成するため、左側の結合を正確に表すことができず、右側に一致しないケースを正しく処理しません。左側の要素が与えられます

DefaultIfEmpty()を使用した正しい方法 推奨されるアプローチは、

メソッドをレバレッジします。 この方法は、一致する右側の要素がないことをエレガントに処理します。

ここで、左外結合を効果的に実行する方法:DefaultIfEmpty()

このコードは、最初にグループ結合(

)を実行します。
<code class="language-csharp">var q =
    from l in lefts
    join r in rights on l.Key equals r.Key into ps_jointable
    from p in ps_jointable.DefaultIfEmpty()
    select new { LeftId = l.Id, RightId = p?.Id ?? 0 };</code>
次に、

が空であっても(右側に一致しない)、単一の要素が生成され、後続のinto ps_jointable句が各左側の要素を処理できるようにします。 null-conditional演算子(>)は、一致していない場合にデフォルトとして0を割り当てるDefaultIfEmpty()

以上が「Join-on-Equals-Into」条項を使用せずにLINQで左外の結合を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。