使用LINQ擴充法執行左外連線
左外連接是一種聯結操作,它會傳回左側表(稱為「父」表)中的所有行,以及右側表(稱為「子」表)中僅符合的行。如果在子表中找不到符合的行,則父表中該行的傳回值為null。
在LINQ中,執行左外連接的一種方法是使用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
是指定用於連接兩個表的鍵的lambda表達式。 GroupJoin
方法中的匿名型別組合了父行和子行。 DefaultIfEmpty()
方法確保對於沒有符合父行的子行回傳null值。 SelectMany
方法將匿名類型的序列展平為單一序列,每個元素代表父表中的一行和對應的子行(如果不存在符合的子行,則為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中文網其他相關文章!