当我们在使用Linq时,有时候我们需要将两个数据源进行连接(Join)操作,LINQ提供了以下几种连接操作符:
- Inner Join(join in)
- Left Outer Join (join...into...from...DefaultIfEmpty)
- Right Outer Join (join...into...from...DefaultIfEmpty)
- Full Outer Join (两次外连接操作union操作)
下面我们分别进行详细讲解,并给出相应的示例:
1. Inner Join
Inner Join只返回两个数据源中匹配的集合,语法格式如下:
var query = from s in source
join o in other
on s.Key equals o.Key
select new { s, o };
其中source和other都是需要连接的集合,s和o表示在连接后的匹配项,select语句可以对匹配的s和o进行筛选(即获取需要的值)。
下面是一个实际的示例:
假设我们有两个Class对象的集合,一个是所有学生列表,一个是所有教师列表,现在我们需要找出所有学生和他们的授课老师,则可以使用Inner Join连接操作,示例代码如下:
class Teacher
{
public string Name { get; set; }
public int ID { get; set; }
public override string ToString()
{
return $"{ID}:{Name} ";
}
}
class Student
{
public string Name { get; set; }
public int ID { get; set; }
public int TeacherID { get; set; }
public override string ToString()
{
return $"{ID}:{Name} ";
}
}
class TestClass
{
static void Main(string[] args)
{
List<Teacher> teachers = new List<Teacher>()
{
new Teacher(){ID=1, Name="Tom"},
new Teacher(){ID=2, Name="Jerry"},
new Teacher(){ID=3, Name="Nick"}
};
List<Student> students = new List<Student>()
{
new Student(){ID=101, Name="小明", TeacherID=1},
new Student(){ID=102, Name="小花", TeacherID=1},
new Student(){ID=103, Name="小李", TeacherID=2},
new Student(){ID=104, Name="小赵", TeacherID=3},
};
var query = from s in students
join t in teachers
on s.TeacherID equals t.ID
select new { s.ID, s.Name, TeacherName=t.Name };
foreach (var item in query)
{
Console.WriteLine($"{item.ID}:{item.Name}:{item.TeacherName}");
}
}
}
运行以上代码可以得到输出结果:
101:小明:Tom
102:小花:Tom
103:小李:Jerry
104:小赵:Nick
2. Left Outer Join
Left Outer Join连接相当于查询source集合中的数据即使在other集合中不存在也会返回,other集合中对应的部分为null,其语法格式如下:
var query = from s in source
join o in other
on s equals o into sg
from x in sg.DefaultIfEmpty()
select new { s, x };
其中source和other分别表示要连接的两个集合,"on s equals o into sg"表示将连接后的结果按照key分组,"from x in sg.DefaultIfEmpty()"表示将连接后的集合再次遍历,将不存在的部分用Nullable变量默认值代替。
以下是一个示例代码:
class TestClass
{
static void Main(string[] args)
{
List<string> source = new List<string>() { "A", "B", "C","D","E"};
List<string> other = new List<string>() { "A", "D", "F"};
var query = from s in source
join o in other
on s equals o into sg
from x in sg.DefaultIfEmpty()
select new { s, x };
foreach (var item in query)
{
Console.WriteLine($"{item.s},{item.x}");
}
}
}
执行以上代码,可以得到输出结果:
A,A
B,
C,
D,D
E,
以上我们就给出了Linq中连接操作符的完整攻略,其中包含Inner Join和Left Outer Join两种连接操作符的详细讲解及示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linq中的连接操作符 - Python技术站