LINQ Join Operators (조인연산자)

2022. 2. 10. 00:00CSharp/Advance

반응형

SQL 조인 연산자와 유사한 기능을 수행

 

교차조인 (Cross Join)

// product 의 category 와 categories 의 category 를 조인 연산
string[] categories = {
    "Beverages",
    "Condiments",
    "Vegetables",
    "Dairy Products",
    "Seafood"
};
List<Product> products = GetProductList();
var q = from c in categories
        join p in products on c equals p.Category
        select (Category: c, p.ProductName);
foreach (var v in q)
{
    Console.WriteLine(v.ProductName + ": " + v.Category);
}
// output
Chai: Beverages
Chang: Beverages
Guarana Fantastica: Beverages
...
Aniseed Syrup: Condiments
Chef Anton's Cajun Seasoning: Condiments
Chef Anton's Gumbo Mix: Condiments
...
Queso Cabrales: Dairy Products
Queso Manchego La Pastora: Dairy Products
Gorgonzola Telino: Dairy Products
...
Spegesild: Seafood
Escargots de Bourgogne: Seafood
Rod Kaviar: Seafood

그룹조인 (Group join)

string[] categories = {
    "Beverages",
    "Condiments",
    "Vegetables",
    "Dairy Products",
    "Seafood"
};
List<Product> products = GetProductList();
var q = from c in categories
        join p in products on c equals p.Category into ps
        select (Category: c, Products: ps);
foreach (var v in q)
{
    Console.WriteLine(v.Category + ":");
    foreach (var p in v.Products)
    {
        Console.WriteLine("   " + p.ProductName);
    }
}
// output
Beverages:
   Chai
   Chang
   ...
   Lakkalikoori
Condiments:
   Aniseed Syrup
   Chef Anton's Cajun Seasoning
   ...
   Original Frankfurter grune Soße
Vegetables:
Dairy Products:
   Queso Cabrales
   Queso Manchego La Pastora
   ...
   Mozzarella di Giovanni
Seafood:
   Ikura
   Konbu
   ...
   Rod Kaviar

Left outer join 

// vegetables 같은 경우는 matching 되는 값이 없지만
// 해당값을 null 로 하여 join 하게 된다. 
// output 에 확인해 보면 아래와 같이 표시된다.
// (No products): Vegetables
string[] categories = {
    "Beverages",
    "Condiments",
    "Vegetables",
    "Dairy Products",
    "Seafood"
};
List<Product> products = GetProductList();
var q = from c in categories
        join p in products on c equals p.Category into ps
        from p in ps.DefaultIfEmpty()
        select (Category: c, ProductName: p == null ? "(No products)" : p.ProductName);
foreach (var v in q)
{
    Console.WriteLine($"{v.ProductName}: {v.Category}");
}
// output
Chai: Beverages
Chang: Beverages
Guarana Fantastica: Beverages
Sasquatch Ale: Beverages
Steeleye Stout: Beverages
Cote de Blaye: Beverages
Chartreuse verte: Beverages
Ipoh Coffee: Beverages
Laughing Lumberjack Lager: Beverages
Outback Lager: Beverages
Rhonbrau Klosterbier: Beverages
Lakkalikoori: Beverages
Aniseed Syrup: Condiments
Chef Anton's Cajun Seasoning: Condiments
Chef Anton's Gumbo Mix: Condiments
Grandma's Boysenberry Spread: Condiments
Northwoods Cranberry Sauce: Condiments
Genen Shouyu: Condiments
Gula Malacca: Condiments
Sirop d'erable: Condiments
Vegie-spread: Condiments
Louisiana Fiery Hot Pepper Sauce: Condiments
Louisiana Hot Spiced Okra: Condiments
Original Frankfurter grune Soße: Condiments
(No products): Vegetables
Queso Cabrales: Dairy Products
Queso Manchego La Pastora: Dairy Products
Gorgonzola Telino: Dairy Products
Mascarpone Fabioli: Dairy Products
Geitost: Dairy Products
Raclette Courdavault: Dairy Products
Camembert Pierrot: Dairy Products
Gudbrandsdalsost: Dairy Products
Flotemysost: Dairy Products
Mozzarella di Giovanni: Dairy Products
Ikura: Seafood
Konbu: Seafood
Carnarvon Tigers: Seafood
Nord-Ost Matjeshering: Seafood
Inlagd Sill: Seafood
Gravad lax: Seafood
Boston Crab Meat: Seafood
Jack's New England Clam Chowder: Seafood
Rogede sild: Seafood
Spegesild: Seafood
Escargots de Bourgogne: Seafood
Rod Kaviar: Seafood

 

관련영상

https://youtu.be/Wnv10vgocY4

 

반응형