ホームページ >バックエンド開発 >C++ >拡張メソッドを使用してLINQで左外の結合を実行する方法は?

拡張メソッドを使用してLINQで左外の結合を実行する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-24 10:01:09254ブラウズ

How to Perform Left Outer Joins in LINQ Using Extension Methods?

LINQ 拡張メソッドを使用して左外部結合を実行する

左外部結合は、左側のテーブル (「親」テーブルと呼ばれる) のすべての行を返し、右側のテーブル (「子」テーブルと呼ばれる) の一致する行のみを返す結合操作です。子テーブルに一致する行が見つからない場合、親テーブルのその行の戻り値は null になります。

LINQ で左外部結合を実行する 1 つの方法は、Join メソッドを使用することです。これにより、親テーブルと子テーブルの属性を含む匿名の型付きシーケンスが作成されます。ただし、同じ結果を達成するより便利な方法は、GroupJoin および SelectMany 拡張メソッドを使用することです。

拡張メソッドを使用した左外部結合構文は次のとおりです:

<code class="language-csharp">var query = parentTable.GroupJoin(
    childTable, 
    parentKeySelector,
    childKeySelector,
    (parent, child) => new { Parent = parent, Child = child.DefaultIfEmpty() })
    .SelectMany(
        x => x.Child,
        (x, y) => new { Parent = x.Parent, Child = y });</code>

この構文では:

  • parentTablechildTable は結合されるテーブルです。
  • parentKeySelectorchildKeySelector は、2 つのテーブルを結合するために使用されるキーを指定するラムダ式です。
  • GroupJoin メソッドの匿名型は、親行と子の行を結合します。
  • DefaultIfEmpty() メソッドは、一致する親行がない子行に対して null を返すようにします。
  • SelectMany メソッドは、匿名型のシーケンスを 1 つのシーケンスに平坦化し、各要素が親テーブル内の行と対応する子行 (一致する子行が存在しない場合は null) を表します。

SQL で次の左外部結合クエリを考えてみましょう:

<code class="language-sql">SELECT f.*, b.*
FROM Foo f
LEFT JOIN Bar b ON f.Foo_Id = b.Foo_Id;</code>

このクエリは、拡張メソッドを使用して次のように表現できます。

<code class="language-csharp">var query = Foo.GroupJoin(
    Bar, 
    f => f.Foo_Id,
    b => b.Foo_Id,
    (f, b) => new { Foo = f, Bar = b.DefaultIfEmpty() })
    .SelectMany(
        x => x.Bar,
        (f, b) => new { Foo = f.Foo, Bar = b });</code>

このクエリは一連の匿名型を返します。各型には Foo テーブルと Bar テーブルのプロパティが含まれます。 Foo テーブルの行に Bar テーブルに一致する行がない場合、対応する Bar プロパティは null になります。

以上が拡張メソッドを使用してLINQで左外の結合を実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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