piątek, 6 kwietnia 2012

LEFT JOIN w LINQ

W SQLu oprócz złączeń wewnętrznych (INNER) mamy także złączenia zewnętrzne (OUTER). Złączenia zewnętrzne rozszerzają złączenia wewnętrzne, uzupełniając wynik złączenia wewnętrznego o rekordy które nie zostałyby włączone do wyniku z powodu warunku złączenia.

Na warsztat weźmiemy bazę danych AdventureWorksLT2008R2 (dostępna do zainstalowania jako sample do SQL Server 2008 R2) i proste zapytanie, którego celem jest wykazanie kategorii dla których nie ma żadnych produktów:

SELECT pc.Name
FROM SalesLT.ProductCategory pc LEFT JOIN SalesLT.Product p ON pc.ProductCategoryID = p.ProductCategoryID
WHERE p.ProductID IS NULL

Jak przełożyć to zapytanie na LINQ?
Code:
            using(var context = new AdventureWorks())
            {
                var categoriesWithoutProducts = from productCategories in context.ProductCategory
                                                join product in context.Product on
                                                    productCategories.ProductCategoryID equals
                                                    product.ProductCategoryID into prodCat
                                                from product in prodCat.DefaultIfEmpty()
                                                where product == null
                                                select productCategories.Name;

                var sql = ((ObjectQuery) categoriesWithoutProducts).ToTraceString();

                foreach (var categoriesWithoutProduct in categoriesWithoutProducts)
                {
                    Console.WriteLine(categoriesWithoutProduct);
                }

            }

Wykorzystujemy tutaj tzw. Grouped Join.
Zgodnie z tym co można znaleźć na MSDN, Grouped Join łączy wszystkie elementy kolekcji pierwszej z pasującymi w drugiej. Oznacza to, że jeżeli w drugiej kolekcji nie będzie elementów pasujących do elementów z pierwszej kolekcji, w wyniku otrzymamy element pierwszej kolekcji bez z pustym zbiorem elementów z drugiej kolekcji.

Brak komentarzy:

Prześlij komentarz