指的是结果生成两张表可以连接的部分
- private void button1_Click_1(object sender, EventArgs e)
- {
- //初始化Student数组
- Student[] arrStu = new Student[]{
- new Student{ID=1,SName="zhangsan",Age=20},
- new Student{ID=2,SName="lisi",Age=21},
- new Student{ID=3,SName="wangwu",Age=23},
- new Student{ID=4,SName="liuliu",Age=24},
- };
- //初始化Product数组
- Product[] arrPro = new Product[]{
- new Product{ID=1,PName="Apple",Price=2.25},
- new Product{ID=2,PName="Orange",Price=5.25},
- new Product{ID=3,PName="Banana",Price=7.5},
- new Product{ID=4,PName="StrawBerry",Price=6.5},
- };
- //标准查询运算符
- var query = arrStu.Join(arrPro, s => s.ID, p => p.ID, (s, p) =>new { s.SName, s.Age, p.PName, p.Price });
- StringBuilder sbRes = new StringBuilder();
- //打印
- foreach (var item in query)
- {
- sbRes.AppendFormat("SName:{0},Age:{1},PName:{2},Price:{3}", item.SName, item.Age, item.PName, item.Price);
- sbRes.AppendLine();
- }
- MessageBox.Show(sbRes.ToString());
- }
或者另外一种写法
- //LINQ语句
- var query = from sItem in arrStu
- join pItem in arrPro
- on sItem.ID equals pItem.ID
- select new { sItem.SName, sItem.Age, pItem.PName, pItem.Price };//Select后面接一个匿名对象
第一个集合中的每个元素与第二个集合中的一组相关元素进行配对
使用 into关键词
- Person magnus = new(FirstName: "Magnus", LastName: "Hedlund");
- Person terry = new("Terry", "Adams");
- Person charlotte = new("Charlotte", "Weiss");
- Person arlene = new("Arlene", "Huff");
-
- List
people = new() { magnus, terry, charlotte, arlene }; -
- List
pets = new() - {
- new(Name: "Barley", Owner: terry),
- new("Boots", terry),
- new("Whiskers", charlotte),
- new("Blue Moon", terry),
- new("Daisy", magnus),
- };
-
- // 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($"{v.OwnerName}:");
-
- // Output each of the owner's pet's names.
- foreach (var pet in v.Pets)
- {
- Console.WriteLine($" {pet.Name}");
- }
- }
-
- /* Output:
- Magnus:
- Daisy
- Terry:
- Barley
- Boots
- Blue Moon
- Charlotte:
- Whiskers
- Arlene:
- */
3. 左外连接
简单理解就是,基于第一张表,无论第二章表是否有匹配项,都放进去
左连接的数据 一定 大于等于 内连接
- Person magnus = new("Magnus", "Hedlund");
- Person terry = new("Terry", "Adams");
- Person charlotte = new("Charlotte", "Weiss");
- Person arlene = new("Arlene", "Huff");
-
- Pet barley = new("Barley", terry);
- Pet boots = new("Boots", terry);
- Pet whiskers = new("Whiskers", charlotte);
- Pet bluemoon = new("Blue Moon", terry);
- Pet daisy = new("Daisy", magnus);
-
- // Create two lists.
- List
people = new() { magnus, terry, charlotte, arlene }; - List
pets = new() { 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?.Name ?? string.Empty
- };
-
- foreach (var v in query)
- {
- Console.WriteLine($"{v.FirstName + ":",-15}{v.PetName}");
- }
-
- record class Person(string FirstName, string LastName);
- record class Pet(string Name, Person Owner);
-
- // This code produces the following output:
- //
- // Magnus: Daisy
- // Terry: Barley
- // Terry: Boots
- // Terry: Blue Moon
- // Charlotte: Whiskers
- // Arlene:
reference: