LINQ的内部联接、分组联接和左外部联接

最近在优化定时任务相关的代码,建议是把总查询放到内存中去坐,尽量减少打开的数据库连接

1. 内连接

指的是结果生成两张表可以连接的部分

cs 复制代码
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());
        }

或者另外一种写法

cs 复制代码
            //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后面接一个匿名对象 
           

2. 分组连接

第一个集合中的每个元素与第二个集合中的一组相关元素进行配对

使用 into关键词

cs 复制代码
Person magnus = new(FirstName: "Magnus", LastName: "Hedlund");
Person terry = new("Terry", "Adams");
Person charlotte = new("Charlotte", "Weiss");
Person arlene = new("Arlene", "Huff");

List<Person> people = new() { magnus, terry, charlotte, arlene };

List<Pet> 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:
 */
  1. 左外连接

简单理解就是,基于第一张表,无论第二章表是否有匹配项,都放进去

左连接的数据 一定 大于等于 内连接

cs 复制代码
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<Person> people = new() { magnus, terry, charlotte, arlene };
List<Pet> 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:

  1. 执行左外部联接(C# 中的 LINQ) - C# | Microsoft Learn
相关推荐
XiaoZhenHua985 小时前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng6617 小时前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d
淡海水8 小时前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
clz13145219 小时前
用 Akka Actor 模拟消费 Kafka 加工处理并发送到 Flink Out Kafka 的完整示例
flink·kafka·linq
XiaoZhenHua989 小时前
C# WinForms + 西门子S7 + SQLite + EPPlus生产数据采集系统架构设计
系统架构·sqlite·c#
Lost of 程序猿10 小时前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net
cjp5601 天前
012.UG二次开发,UG管道服务器与WPF管道通讯,传输JSON数据
c#
jiushidt1 天前
ArcGIS Pro Add‑in 打包流程详解
arcgis·c#·.net·arcgispro
geovindu2 天前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
软件黑马王子2 天前
20.Resources资源加载:基本实现
开发语言·前端框架·c#