LINQ 中的连接运算符
连接是指以难以直接跟踪彼此关系的数据源为目标的操作。
运算符 | 描述 | C# 查询表达式语法 | VB 查询表达式语法 |
---|---|---|---|
连接 | 运算符根据匹配的键连接两个序列 | join … in … on … equals … | From x In …, y In … Where x.a = y.a |
GroupJoin | 连接两个序列并对匹配的元素进行分组 | join … in … on … equals … into … | Group Join … In … On … |
连接示例 - 查询表达式
C#
using System; using System.Collections.Generic; using System.Linq; namespace Operators { class JoinTables { class DepartmentClass { public int DepartmentId { get; set; } public string Name { get; set; } } class EmployeeClass { public int EmployeeId { get; set; } public string EmployeeName { get; set; } public int DepartmentId { get; set; } } static void Main(string[] args) { List <DepartmentClass> departments = new List <DepartmentClass>(); departments.Add(new DepartmentClass { DepartmentId = 1, Name = "Account" }); departments.Add(new DepartmentClass { DepartmentId = 2, Name = "Sales" }); departments.Add(new DepartmentClass { DepartmentId = 3, Name = "Marketing" }); List <EmployeeClass> employees = new List <EmployeeClass>(); employees.Add(new EmployeeClass { DepartmentId = 1, EmployeeId = 1, EmployeeName = "William" }); employees.Add(new EmployeeClass { DepartmentId = 2, EmployeeId = 2, EmployeeName = "Miley" }); employees.Add(new EmployeeClass { DepartmentId = 1, EmployeeId = 3, EmployeeName = "Benjamin" }); var list = (from e in employees join d in departments on e.DepartmentId equals d.DepartmentId select new { EmployeeName = e.EmployeeName, DepartmentName = d.Name }); foreach (var e in list) { Console.WriteLine("Employee Name = {0} , Department Name = {1}", e.EmployeeName, e.DepartmentName); } Console.WriteLine(" Press any key to continue."); Console.ReadKey(); } } }
VB
Module Module1 Sub Main() Dim account As New Department With {.Name = "Account", .DepartmentId = 1} Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2} Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3} Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing}) Dim william As New Employee With {.EmployeeName = "William", .EmployeeId = 1, .DepartmentId = 1} Dim miley As New Employee With {.EmployeeName = "Miley", .EmployeeId = 2, .DepartmentId = 2} Dim benjamin As New Employee With {.EmployeeName = "Benjamin", .EmployeeId = 3, .DepartmentId = 1} Dim employees As New System.Collections.Generic.List(Of Employee)(New Employee() {william, miley, benjamin}) Dim list = (From e In employees Join d In departments On e.DepartmentId Equals d.DepartmentId Select New Person With {.EmployeeName = e.EmployeeName, .DepartmentName = d.Name}) For Each e In list Console.WriteLine("Employee Name = {0} , Department Name = {1}", e.EmployeeName, e.DepartmentName) Next Console.WriteLine(vbLf &"Press any key to continue.") Console.ReadKey() End Sub Class Employee Public Property EmployeeId As Integer Public Property EmployeeName As String Public Property DepartmentId As Integer End Class Class Department Public Property Name As String Public Property DepartmentId As Integer End Class Class Person Public Property EmployeeName As String Public Property DepartmentName As String End Class End Module
当编译并执行上述 C# 或 VB 代码时,会产生以下结果 −
Emplyee Name = William, Department Name = Account Emplyee Name = Miley, Department Name = Sales Emplyee Name = Benjamin, Department Name = Account Press any key to continue.