C#|C# Linq 左外联

【C#|C# Linq 左外联】C# Linq 左外联
假设我们有一个Student类,具有姓名、年龄、班级Id三个属性
还有一个Class类,具有Id,班级名两个属性
现要查找学生姓名、年龄和其所在班级名,因此需要做一个Student表左联Class表的操作
方式一:

var results = from s in students join c in classes on s.ClassId equals c.Id into scs from sc in scs.DefaultIfEmpty() select new { Name = s.Name, Age = s.Age, ClassName = sc?.ClassName ?? string.Empty };

方式二:
var results = students.GroupJoin(classes, s => s.ClassId, c => c.Id, (s, cs) => new {Name = s.Name, Age = s.Age, ClassName = cs.ElementAtOrDefault(0) is null ? string.Empty : cs.ElementAt(0).ClassName });

完整代码演示:
using System; using System.Collections.Generic; using System.Linq; public class Student {public string Name { get; set; } public int Age { get; set; } public int ClassId { get; set; } }public class Class {public int Id { get; set; } public string ClassName { get; set; } }public class Program {public static void Main() {List> students = new List>() {new Student(){ Name = "B", Age = 18, ClassId = 1}, new Student(){ Name = "C", Age = 19, ClassId = 2}, new Student(){ Name = "A", Age = 20, ClassId = 3}, new Student(){ Name = "D", Age = 20, ClassId = 4}, new Student(){ Name = "E", Age = 20, ClassId = 5}, }; List classes = new List() {new Class(){ Id = 1, ClassName = "1班"}, new Class(){ Id = 2, ClassName = "2班"}, new Class(){ Id = 3, ClassName = "3班"}, }; //方式一: //var results = from s in students //join c in classes on s.ClassId equals c.Id into scs //from sc in scs.DefaultIfEmpty() //select new { Name = s.Name, Age = s.Age, ClassName = sc?.ClassName ?? string.Empty }; //方式二: var results = students.GroupJoin(classes, s => s.ClassId, c => c.Id, (s, cs) => new {Name = s.Name, Age = s.Age, ClassName = cs.ElementAtOrDefault(0) is null ? string.Empty : cs.ElementAt(0).ClassName }); foreach (var result in results) {Console.WriteLine($"{ result.Name} { result.Age} { result.ClassName}"); } } }

    推荐阅读