美文网首页
C# LiNQ 查询 join连接

C# LiNQ 查询 join连接

作者: black墨 | 来源:发表于2021-02-25 17:07 被阅读0次

join 子句可用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联。 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。

测试数据代码

  #region TestData

        public class Student
        {
            public string StudentName;
            public int GradeId;
        }
        public class Grade
        {
            public int ID;
            public string GradeName;
        }
        List<Student> students = new List<Student>()
        {
            new Student {StudentName="zs", GradeId =1},
            new Student {StudentName="ls", GradeId = 1},
            new Student {StudentName="ww", GradeId = 2}
        };
        List<Grade> grades = new List<Grade>()
        {
            new Grade {ID = 1, GradeName ="一年级"},
            new Grade {ID = 2, GradeName ="二年级"},
            new Grade {ID = 3, GradeName ="三年级"}
        };

        #endregion

内连接

内部同等连接,下面为演示代码,缺少了三年级

  void Innerjoin ()
        {
            var innerQuery = from grade in grades
                             join student in students on grade.ID equals student.GradeId
                             select new { StudentName = student.StudentName, GradeName = grade.GradeName };
            foreach (var item in innerQuery)
            {
                Console.WriteLine($"班级:{item.GradeName},有学生{item.StudentName}");
            }
        }
图片.png

分组连接

分组联接会生成分层的结果序列,该序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。 分组联接没有等效的关系术语;它本质上是一个对象数组序列。

如果在右侧源序列中找不到与左侧源中的元素相匹配的元素,则 join 子句会为该项生成一个空数组。 因此,分组联接基本上仍然是一种内部同等联接,区别在于分组联接将结果序列组织为多个组。

        void Groupjoin()
        {
            var innerQuery = from grade in grades
                             join student in students on grade.ID equals student.GradeId into student_grade
                             select new { StudentData = from student2 in student_grade orderby student2.GradeId select student2 , GradeName = grade.GradeName };
            foreach (var item in innerQuery)
            {
                Console.WriteLine("班级内有哪些人:");
                foreach (var studentItem in item.StudentData)
                {
                   Console.WriteLine($"班级:{item.GradeName},有学生{studentItem.StudentName}");
                }
               
            }
        }
图片.png

从上图可以看到,多加了一句前面的打印,这个 关于三年级的数组肯定是存在的,但是是空的数据,如果没有数据,得到的结果就跟内连接一致。

左外连接

在左外部联接中,将返回左侧源序列中的所有元素,即使右侧序列中没有其匹配元素也是如此。 若要在 LINQ 中执行左外部联接,请结合使用 DefaultIfEmpty 方法与分组联接,指定要在某个左侧元素不具有匹配元素时生成的默认右侧元素。 可以使用 null 作为任何引用类型的默认值,也可以指定用户定义的默认类型。

        void LeftOutJoin()
        {
            var innerQuery = from grade in grades
                             join student in students on grade.ID equals student.GradeId into student_grade
                             from studentData in student_grade.DefaultIfEmpty(new Student { StudentName = "没有学生哦!" })
                             select new { StudentData = studentData, GradeName = grade.GradeName };
            foreach (var item in innerQuery)
            {


                Console.WriteLine($"班级:{item.GradeName},有学生{item.StudentData.StudentName}");

            }
        }
图片.png

从上面看到左外连接,默认出一个值,可以防止没有数组出现问题。

相关文章

  • C# LiNQ 查询 join连接

    join 子句可用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联。 唯一的要求是每个源中的元素需要共享...

  • EF Core 备忘

    模糊查询sql linq 内连接查询sql linq 左连接查询sql linq 左连接查询(连接内带条件)sql...

  • C#3.0 LINQ(语言集成查询)

    定义 LINQ:将查询功能集成到C#语言的技术统称,它允许我们以SQL查询数据库的方式来查询数据集合 LINQ的查...

  • 连接查询;外键

    连接查询 连接查询(join)分类:内连接、外连接、自然连接、交叉连接 使用方式:左表 join 右表 交叉连接(...

  • 连接查询;外键

    连接查询 连接查询(join)分类:内连接、外连接、自然连接、交叉连接 使用方式:左表 join 右表 交叉连接(...

  • 使用 Linq 进行左连接查询

    使用 linq 进行左连接查询 Intro 今天改项目发现一个bug,原因是因为两个数据 join 的时候另外一个...

  • SQL inner join和left join on

    SQL中的查询连接有 inner join(内连接),left join(左连接),right join(右连接)...

  • left join,right join,inner join,

    sql中的连接查询有inner join(内连接)、left join(左连接)、right join(右连接)、...

  • C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    前言 C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重...

  • 数据库-联表查询

    SQL使用(一)——联合查询 1.联合查询分类 内连接(inner Join 或 Join) 外连接(outer ...

网友评论

      本文标题:C# LiNQ 查询 join连接

      本文链接:https://www.haomeiwen.com/subject/sxisfltx.html