LINQ Join操作

连接是指其中有困难的数据源,以跟随在一个直接的方式相互关系的目标的操作。

运算符 描述 C#查询表达式语法 VB查询表达式语法
Join 运算符连接两个序列匹配键的基础 join … in … on … equals … From x In …, y In … Where x.a = y.a
GroupJoin 连接两个序列和组匹配元素 join … in … on … equals … into … Group Join … In … On …

查询表达式 - Join操作示例

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("\nPress 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.

上一篇: LINQ过滤运算符 下一篇: LINQ投影操作