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.