[C# LINQ] inner join / left join / right join
inner join :
using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Address
{
public int ID { get; set; }
public string Street { get; set; }
}
class Program
{
static void Main()
{
List<Person> people = new List<Person>
{
new Person { ID = 1, Name = "Alice" },
new Person { ID = 2, Name = "Bob" },
new Person { ID = 3, Name = "Charlie" }
};
List<Address> addresses = new List<Address>
{
new Address { ID = 1, Street = "123 Main St" },
new Address { ID = 2, Street = "456 Elm St" },
new Address { ID = 4, Street = "789 Oak St" }
};
var query = from person in people
join address in addresses
on person.ID equals address.ID
select new
{
person.Name,
address.Street
};
foreach (var result in query)
{
Console.WriteLine($"Name: {result.Name}, Street: {result.Street}");
}
}
}
left join :
- 左連接會返回左邊清單的所有元素,以及那些符合連接條件的右邊清單的元素,如果右邊清單中沒有匹配的元素,則返回null或默認值
- 在這個左連接的示例中,我們使用into子句將右邊清單的元素分組到addressGroup,然後使用from子句和DefaultIfEmpty方法來處理左連接。如果沒有匹配的地址,address會為null,我們在結果中使用條件運算符處理這種情況(沒有判斷null, 會發生null exception)。
var leftJoinQuery = from person in people
join address in addresses
on person.ID equals address.ID into addressGroup
from address in addressGroup.DefaultIfEmpty()
select new
{
person.Name,
Address = address == null ? "No Address" : address.Street
};
foreach (var result in leftJoinQuery)
{
Console.WriteLine($"Name: {result.Name}, Street: {result.Address}");
}
right join :
- 右連接類似於左連接,但返回右邊清單的所有元素,以及那些符合連接條件的左邊清單的元素,如果左邊清單中沒有匹配的元素,則返回null或默認值。
- 在這個右連接的示例中,我們反轉了左右清單的位置,然後使用相同的into子句和DefaultIfEmpty方法來處理右連接。如果沒有匹配的人名,person會為null,我們在結果中使用條件運算符處理這種情況(沒有判斷null, 會發生null exception)。
var rightJoinQuery = from address in addresses
join person in people
on address.ID equals person.ID into personGroup
from person in personGroup.DefaultIfEmpty()
select new
{
Address = address.Street,
Name = person == null ? "No Name" : person.Name
};
foreach (var result in rightJoinQuery)
{
Console.WriteLine($"Name: {result.Name}, Street: {result.Address}");
}
留言
張貼留言