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