【发布时间】:2015-01-21 23:58:22
【问题描述】:
This MSDN page 给出了以下外连接示例:
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:
join 关键字的意义何在?以下查询具有相同的结果。
var query2 = from person in people
from pet in pets.Where (p => p.Owner.Equals(person)).DefaultIfEmpty()
select new { person.FirstName, PetName = (pet == null ? String.Empty : pet.Name) };
这两个在功能上是等价的吗?如果不是,它们有何不同?如果是,使用join 关键字进行外连接有什么好处?似乎是编写“where”子句的一种奇特方式。但也许在其他情况下它确实有用?
注意:我意识到 join 子句很可能也用于内部联接、组联接等,我想了解是否有理由将其用于外部联接。
【问题讨论】: