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>
この構文では:
parentTable
と childTable
は結合されるテーブルです。 parentKeySelector
と childKeySelector
は、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 サイトの他の関連記事を参照してください。