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<Student> students = new List<Student>()
{
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<Class> classes = new List<Class>()
{
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}");
}
}
}