HOW TO:執行左外部聯結 (C# 程式設計手冊)
左外部聯結是傳回第一個集合之每個項目的聯結,無論在第二個集合中有無相關項目都一樣。您可以使用 LINQ 呼叫群組結果的 DefaultIfEmpty 方法執行左外部聯結聯結。
範例
下列範例示範如何在群組聯結的結果上使用 DefaultIfEmpty 方法,以執行左外部聯結。
產生兩個集合之左外部聯結的第一個步驟是使用群組聯結執行內部聯結 (如需此處理序的說明,請參閱 HOW TO:執行內部聯結 (C# 程式設計手冊))。在此範例中, Person 物件的清單內部聯結至以 Person 物件的 Pet 物件清單符合 Pet.Owner。
第二個步驟是包含結果集中第一個 (左) 集合中的每個項目,即使該項目在右集合中沒有相符項目也一樣。這個動作可以藉由從群組聯結在相符項目的每個序列上呼叫 DefaultIfEmpty 而達成。在此範例中,呼叫 DefaultIfEmpty 符合 Pet 物件序列。方法會傳回包含單一的集合,因此,如果符合 Pet 物件序列的任何 Person 物件為 null,如此可確保預設值的每個 Person 物件在結果集來表示。
注意事項 |
---|
參考型別的預設值是 null;因此,這個範例會檢查 null 參考在存取每個 Pet 集合中的每一個項目之前。 |
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
public static void LeftOuterJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };
var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };
foreach (var v in query)
{
Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
}
}
// This code produces the following output:
//
// Magnus: Daisy
// Terry: Barley
// Terry: Boots
// Terry: Blue Moon
// Charlotte: Whiskers
// Arlene:
編譯程式碼
在 Visual Studio 中建立一個新的主控台應用程式。
將參考加入至 System.Core.dll (如果尚未參考)。
包括 System.Linq 命名空間。
複製和貼上此範例的程式碼放入 program.cs 檔,包含 Program 類別之 Main 方法的下方。將程式碼新增至 Main 方法呼叫 LeftOuterJoinExample 方法。
執行程式。