如何理解C#中的分组联接
发布网友
发布时间:2022-05-05 07:37
我来回答
共1个回答
热心网友
时间:2023-09-05 15:02
文章废话较多,慢慢看.如果等不急,直接拉到最下面看总结.
分组联接可用于产生分层数据结构。 它将第一个集合中的每个元素与第二个集合中的一组相关元素进行配对。
例如,一个名为 Student 的类或关系数据库表可能包含两个字段:Id 和 Name。 另一个名为 Course 的类或关系数据库表可能包含两个字段:StudentId 和 CourseTitle。 这两个数据源的分组联接(基于匹配的 Student.Id 和 Course.StudentId)会将每个 Student 与一个 Course 对象集合(可能为空)组合在一起。
下面的示例根据与 Pet.Owner 属性匹配的 Person 来对 Person 和 Pet 类型的对象执行分组联接。 与为每个匹配产生一对元素的非分组联接不同,分组联接只为第一个集合的每个元素产生一个结果对象(在此示例中为一个 Person 对象)。 第二个集合中的相应元素(在此示例中为 Pet 对象)被分组到一个集合中。 最后,结果选择器函数为每个包含 Person.FirstName 和一个 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; }
}
/// <summary>
/// This example performs a grouped join.
/// </summary>
public static void GroupJoinExample()
{
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 };
// Create a list where each element is an anonymous type
// that contains the person's first name and a collection of
// pets that are owned by them.
var query = from person in people
join pet in pets on person equals pet.Owner into gj
select new { OwnerName = person.FirstName, Pets = gj };
foreach (var v in query)
{
// Output the owner's name.
Console.WriteLine("{0}:", v.OwnerName);
// Output each of the owner's pet's names.
foreach (Pet pet in v.Pets)
Console.WriteLine(" {0}", pet.Name);
}
}
// This code proces the following output:
//
// Magnus:
// Daisy
// Terry:
// Barley
// Boots
// Blue Moon
// Charlotte:
// Whiskers
// Arlene:
白话来说所谓分组连接就是.
一群小学生都站在操场上排队,这时候你是分不清谁是哪个班的.
但是班级这个对象又是存在的.
当你让每个小学生按照自己的班级属性进行归类后,他们就连接到了班级这个对象上.
也就有了连接.
而分组就是每个班级