Join 子句有三种最常见的联接类型:内部联接,分组联接,左外部联接
本次介绍:分组联接
分组联接:见名知意,它本质上是一个对象数组序列。说白了就是结果序列会组织为多个组形式数据进行返回。
即可术语描述的话,就是会产生一个分层的结果序列,此序列拿第一个集合中的每个元素与第二个集合中的一组相关元素进行配对,如果找不到就返回空数组。那基本上分组联接和内部联接基本差不多。 另外就是在分组联接中没有等效的关系。
* 分组联接非常适合于使用 LINQ to XML 来创建 XML。
public class JoinUsingLinqPartSecInto : Interface
{
Interface Members#region Interface Members
public void invoke()
{
Data#region Data
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 };
List<Person> people = new List<Person>
{
magnus,terry,charlotte, arlene
};
List<Pet> pets = new List<Pet>
{
barley,boots,whiskers,bluemoon,daisy
};
#endregion
/**////创建匿名类型
var query = from person in people
join pet in pets
on person
equals pet.Owner
into nonameList
select new { OwnerName = person.FirstName, Pets = nonameList };
foreach (var v in query)
{
Console.WriteLine("{0}:", v.OwnerName);
foreach (Pet pet in v.Pets)
Console.WriteLine(" {0}", pet.Name);
}
/**////创建表示已联接对象的 XML 元素
System.Xml.Linq.XElement xmlInto = new System.Xml.Linq.XElement
("XmlFileBase",
from person in people
join pet in pets
on person
equals pet.Owner
into pp
select new XElement("Person",
new XAttribute("FirstName", person.FirstName),
new XAttribute("LastName", person.LastName),
from subpet in pp
select new XElement("Pet", subpet.Name)
)
);
Console.WriteLine(xmlInto);
}
#endregion
}
{
Interface Members#region Interface Members
public void invoke()
{
Data#region Data
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 };
List<Person> people = new List<Person>
{
magnus,terry,charlotte, arlene
};
List<Pet> pets = new List<Pet>
{
barley,boots,whiskers,bluemoon,daisy
};
#endregion
/**////创建匿名类型
var query = from person in people
join pet in pets
on person
equals pet.Owner
into nonameList
select new { OwnerName = person.FirstName, Pets = nonameList };
foreach (var v in query)
{
Console.WriteLine("{0}:", v.OwnerName);
foreach (Pet pet in v.Pets)
Console.WriteLine(" {0}", pet.Name);
}
/**////创建表示已联接对象的 XML 元素
System.Xml.Linq.XElement xmlInto = new System.Xml.Linq.XElement
("XmlFileBase",
from person in people
join pet in pets
on person
equals pet.Owner
into pp
select new XElement("Person",
new XAttribute("FirstName", person.FirstName),
new XAttribute("LastName", person.LastName),
from subpet in pp
select new XElement("Pet", subpet.Name)
)
);
Console.WriteLine(xmlInto);
}
#endregion
}
*以下这三种查询基本上都是等效查询(这也是使用分组联接实现内部联接的一例)
querythree使用不带 into 子句的 join 子句执行内部联接所获得的结果集。
1
var queryone
=
from person
in
people
2 join pet in pets
3 on person
4 equals pet.Owner
5 into nonameList
6 select new { OwnerName = person.FirstName, Pets = nonameList } ;
7
8 var querytwo = from person in people
9 join pet in pets
10 on person
11 equals pet.Owner
12 into nonnamelist
13 from subpet in nonnamelist
14 select new { OwnerName = person.FirstName, PetName = subpet.Name } ;
15
16 var querythree = from person in people
17 join pet in pets on person equals pet.Owner
18 select new { OwnerName = person.FirstName, PetName = pet.Name } ;
2 join pet in pets
3 on person
4 equals pet.Owner
5 into nonameList
6 select new { OwnerName = person.FirstName, Pets = nonameList } ;
7
8 var querytwo = from person in people
9 join pet in pets
10 on person
11 equals pet.Owner
12 into nonnamelist
13 from subpet in nonnamelist
14 select new { OwnerName = person.FirstName, PetName = subpet.Name } ;
15
16 var querythree = from person in people
17 join pet in pets on person equals pet.Owner
18 select new { OwnerName = person.FirstName, PetName = pet.Name } ;
LINQ Coding 目录