[C# LINQ] inner join / left join / right join

 

inner join :

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. public class Person
  6. {
  7. public int ID { get; set; }
  8. public string Name { get; set; }
  9. }
  10.  
  11. public class Address
  12. {
  13. public int ID { get; set; }
  14. public string Street { get; set; }
  15. }
  16.  
  17. class Program
  18. {
  19. static void Main()
  20. {
  21. List<Person> people = new List<Person>
  22. {
  23. new Person { ID = 1, Name = "Alice" },
  24. new Person { ID = 2, Name = "Bob" },
  25. new Person { ID = 3, Name = "Charlie" }
  26. };
  27.  
  28. List<Address> addresses = new List<Address>
  29. {
  30. new Address { ID = 1, Street = "123 Main St" },
  31. new Address { ID = 2, Street = "456 Elm St" },
  32. new Address { ID = 4, Street = "789 Oak St" }
  33. };
  34.  
  35. var query = from person in people
  36. join address in addresses
  37. on person.ID equals address.ID
  38. select new
  39. {
  40. person.Name,
  41. address.Street
  42. };
  43.  
  44. foreach (var result in query)
  45. {
  46. Console.WriteLine($"Name: {result.Name}, Street: {result.Street}");
  47. }
  48. }
  49. }
  50.  

left join :

  • 左連接會返回左邊清單的所有元素,以及那些符合連接條件的右邊清單的元素,如果右邊清單中沒有匹配的元素,則返回null或默認值
  • 在這個左連接的示例中,我們使用into子句將右邊清單的元素分組到addressGroup,然後使用from子句和DefaultIfEmpty方法來處理左連接。如果沒有匹配的地址,address會為null,我們在結果中使用條件運算符處理這種情況(沒有判斷null, 會發生null exception)。

  1. var leftJoinQuery = from person in people
  2. join address in addresses
  3. on person.ID equals address.ID into addressGroup
  4. from address in addressGroup.DefaultIfEmpty()
  5. select new
  6. {
  7. person.Name,
  8. Address = address == null ? "No Address" : address.Street
  9. };
  10.  
  11. foreach (var result in leftJoinQuery)
  12. {
  13. Console.WriteLine($"Name: {result.Name}, Street: {result.Address}");
  14. }
  15.  

right join :

  • 右連接類似於左連接,但返回右邊清單的所有元素,以及那些符合連接條件的左邊清單的元素,如果左邊清單中沒有匹配的元素,則返回null或默認值。
  • 在這個右連接的示例中,我們反轉了左右清單的位置,然後使用相同的into子句和DefaultIfEmpty方法來處理右連接。如果沒有匹配的人名,person會為null,我們在結果中使用條件運算符處理這種情況(沒有判斷null, 會發生null exception)。

  1. var rightJoinQuery = from address in addresses
  2. join person in people
  3. on address.ID equals person.ID into personGroup
  4. from person in personGroup.DefaultIfEmpty()
  5. select new
  6. {
  7. Address = address.Street,
  8. Name = person == null ? "No Name" : person.Name
  9. };
  10.  
  11. foreach (var result in rightJoinQuery)
  12. {
  13. Console.WriteLine($"Name: {result.Name}, Street: {result.Address}");
  14. }
  15.  




留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)