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
相关推荐
淡海水3 分钟前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
BD_Marathon24 分钟前
多轮对话聊天机器人
开发语言·机器人·c#
czhc11400756631 小时前
设备标定页防呆为何失效:草稿与真值的错位
c#
周杰伦fans4 小时前
轻量模型高并发推理优化技巧
开发语言·人工智能·c#
周杰伦fans4 小时前
C#对话摘要降低Token消耗
人工智能·后端·c#
en.en..8 小时前
分清 b 与 B:比特、字节(告别8倍、容量、缓冲区误区)
c#
ly76898 小时前
ISR 收缩与 HW 推进:副本同步的边界条件与 UnderReplicated 排障
数据库·kafka·c#·linq·isr·hw·副本同步
miofly8 小时前
GitHub 今日推荐|REDox:64 位 token 表示结构化数据,内存占用降 70% 支持多格式互转
开源·c#·github
淡海水8 小时前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
海宇大数据9 小时前
零信任架构实战:基于海宇身份证OCR构建自动化跨境清关核验网关
人工智能·架构·c#·自动化