首頁 >後端開發 >C++ >如何使用擴充方法在 LINQ 中執行左外連線?

如何使用擴充方法在 LINQ 中執行左外連線?

Linda Hamilton
Linda Hamilton原創
2025-01-24 10:01:09305瀏覽

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

使用LINQ擴充法執行左外連線

左外連接是一種聯結操作,它會傳回左側表(稱為「父」表)中的所有行,以及右側表(稱為「子」表)中僅符合的行。如果在子表中找不到符合的行,則父表中該行的傳回值為null。

在LINQ中,執行左外連接的一種方法是使用Join方法,該方法建立一個匿名類型的序列,其中包含父表和子表中的屬性。但是,實現相同結果的更便捷方法是使用GroupJoinSelectMany擴展方法。

使用擴充方法的左外連接語法如下:

<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是指定用於連接兩個表的鍵的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn