#15 LINQ to Objects.

LINQ to Objects

Jak już wspomniałem dla technologii LINQ źródłem danych może być np. kolekcja, czyli obiekt. Aby pokazać zastosowanie tej technologii prześledźmy sobie poniższy przykład.

Dla potrzeb naszego przykładu stworzymy sobie klasę „Produkt”, która będzie przechowywała model naszego obiektu. W naszym przypadku będą to perfumy.

Listing 18.1 Stworzenie klasy Produkt – modelu danych.

class Produkt
        {
            public int id;
            public string marka, nazwa, 
                  typ,dlaKogo;
            public int pojemnosc, cena;
        }

Określiliśmy model, to teraz stworzymy kolekcję 5 produktów.

Listing 18.2 Tworzymy kolekcję obiektów o typie Produkt.

static List listaProduktow = new List 
{
new Produkt 
{
id=1 , 
marka = "Calvin Klein" , 
nazwa = "Eternity" , 
typ = "woda perfumowana" , 
dlaKogo = "kobiet" , 
pojemnosc = 100 , 
cena = 82
},

new Produkt 
{
id=2 , 
marka = "Calvin Klein" , 
nazwa = "Euphoria" , 
typ ="woda perfumowana" , 
dlaKogo = "kobiet" , 
pojemnosc = 50 , 
cena = 114
},

new Produkt 
{
id=3 , 
marka = "Versace" , 
nazwa = "Bright Crystal" , 
typ ="woda toaletowa" , 
dlaKogo = "kobiet" , 
pojemnosc = 90 , 
cena = 140
},

new Produkt 
{
id=4 , 
marka = "Calvin Klein" , 
nazwa = "Beauty" , 
typ ="woda perfumowana" , 
dlaKogo = "kobiet" , 
pojemnosc = 100 , 
cena = 106
},

new Produkt 
{
id=5 , 
marka = "Dolce & Gabbana" , 
nazwa = "Light Blue" , 
typ ="woda toaletowa" , 
dlaKogo = "kobiet" , 
pojemnosc = 100 , 
cena = 152
}
};

I tutaj dochodzimy do stworzenia zapytania w technologii LINQ do naszego źródła danych, w naszym przypadku jest to kolekcja „listaProduktow”.Na początku stworzymy sobie listę wszystkich obiektów z kolekcji.

Listing 18.3 Tworzymy zapytanie LINQ do kolekcji listaProdutkow.

// tworzenie zapytanie LINQ to Objects
var listaWszystkichProduktow = 
from produkt in listaProduktow
//sortujemy wg marki i ceny
orderby produkt.marka, produkt.cena 
select produkt;
// od razu wyprowadźmy sobie wynik tego 
//zapytania na ekran za pomocą pętli foreach
foreach (var produkt in listaWszystkichProduktow)
 Console.WriteLine(produkt.marka + " " + produkt.nazwa + " " + produkt.cena + " zł");

Łączymy wszystko, co zrobiliśmy do tej pory.

Zobacz cały kod.

Poniżej zrzut ekranu po uruchomieniu programu.

LINQ to Objects
Rysunek 1. Wynik uruchomienia programu.

Operator JOIN

 

Za pomocą technologii LINQ to Objects możemy łączyć zbiory/kolekcje które nie posiadają takiej samej struktury. Do takiej operacji wykorzystujemy operator JOIN. Dla naszych potrzeb z kolekcji listaProdutków stworzymy sobie dwie kolekcje. Pierwsza będzie zawierała id, markę, nazwę i typ, a druga będzie zawierała id, dlaKogo, pojemność i cenę.

Tworzymy pierwszą kolekcję o nazwie perfumy_dane_podstawowe.

Listing 18.5 Tworzymy kolekcję perfumy_dane_podstawowe.

var perfumy_dane_podstawowe = 
from perfumyDP in listaProduktow
       select new { 
                perfumyDP.id , 
                perfumyDP.marka , 
                perfumyDP.nazwa , 
                perfumyDP.typ 
       };

a następnie tworzymy drugą kolekcję perfumy_dane_dodatkowe

Listing 18.6 Tworzymy kolekcję perfumy_dane_dodatkowe.

var perfumy_dane_dodatkwoe = 
from perfumyDD in listaProduktow
       select new { 
         perfumyDD.id, 
         perfumyDD.dlaKogo , 
         perfumyDD.pojemnosc , 
         perfumyDD.cena
       };

Mamy więc dwie kolekcje dotyczące tych samych perfum ale zawierające różne dane. Do prawidłowego połączenia obu kolekcji potrzebujemy jakiegoś klucza, bo chcemy aby dane z pól: dlaKogo, pojemność i cena były przyporządkowane do odpowiednich nazw perfum. Aby móc to zrobić w obu kolekcjach powinno znajdować się pole wg którego będzie możliwe wiązanie i w naszym przypadku tym polem (kluczem) jest pole id. Teraz za pomocą tego klucza (pole Id) wykorzystując operator JOIN będę mógł połączyć obie kolekcje w jedną, co prezentuje poniższy listing.

Listing 18.7 Łączenie dwóch kolekcje z wykorzystaniem operatora JOIN.

var perfumy_wszystkie_dane = 
from perfumy_DP in perfumy_dane_podstawowe
join perfumy_DD in perfumy_dane_dodatkowe
on perfumy_DP.id equals perfumy_DD.id
       select new
{
       perfumy_DP.id,
       perfumy_DP.marka,
       perfumy_DP.nazwa,
       perfumy_DD.pojemnosc,
       perfumy_DD.cena
};

Słówko wyjaśnienia do powyższego kodu. Po słówku FROM określamy pierwszą kolekcję które będzie podlegała łączeniu. Następnie musimy wskazać kolekcję z którą będziemy chcieli łączyć tą pierwszą ale żeby kompilator nas zrozumiał dodajemy słówko JOIN i po nim określamy drugą kolekcję do łączenia. Jak już wcześniej wspomniałem obie kolekcje łączymy po kluczu którym w naszym przypadku jest pole id i to musimy wpisać w kolejnym kroku. Po słówku ON wskazujemy pole id w pierwszej kolumnie, następnie wpisujemy słówko equals (określające, że oba pola id w obu kolekcjach musza być równe) i wskazujemy pole id w drugiej kolekcji. Po słówku SELECT NEW wypisujemy pola jakie chcemy uwzględnić w nowej kolekcji.