Podstawowe funkcje dodatku linq w C# 1. Łączenie Tabel Do łączenia dwóch lub więcej tabel wykorzystujemy komendę join. Składnia całego wyrażenia gotowego do wyświetlenia w DataGridView wygląda następująco: var query = from p in (pierwsza tabela) join c in (druga tabela) on (kolumna z pierszej tabeli)equals (kolumna z drugiej tabeli) select new {wyświetlane kolumny }; Przyjrzyjmy się bliżej linii zawierającej wyrażenie join. Zapisem c in (druga tabela) pokazujemy, którą tabele chcemy dołączyć, następnie wskazujemy kolumnę po której dołączenie ma być wykonane. Wyrażenie equals oznacza że wiersze tych kolumn mają się sobie równać. Linii z wyrażeniem join może być dowolna ilośc co będzie powodować dołączanie kolejnych tabel. Przykład: Posiadamy bazę danych z tabelami, Customers, Orders, Orders_Details. Zapytanie w linq może wyglądać np. tak: var query = from p in dc.customers join order in dc.orders on p.customerid equals order.customerid join s in dc.order_details on order.orderid equals s.orderid select new{p.contactname,p.city,p.country,order.requireddate, order.orderdate,s.unitprice}; Tabele są tutaj przedstawione jako obiekty. Aby wyświetlić interesujące nas kolumny w select new a w nawiasach wpisujemy nazwy kolumn z tabel które dołączyliśmy. I tak w wyniku takiej operacji otrzymamy:
2.Wyświetlanie największej/najmniejszej wartości z kolumny z wykorzystaniem grupowania Nasze wyrażenie będzie wykonywało dwie operacje. Pierwszą pogrupuje wartości z jednej kolumny następnie wyświetli wartość maksymalną bądź minimalną. W przykładzie posłużymy się Tabelą Products w której będziemy pracować na kolumnach CategoryID i UnitPrice. Wyrażenie przyjmuje postać: var query = from p in (tabela) group p by (po której kolumnie na grupować) into g select new {key=g.key,wartosc= (wyrażenie z rezulatem)}; Po wyrażeniu group p by podajemy nazwę po której ma być stworzone grupowanie następnie wskazujemy gdzie to ma zostać przechowane (into g). Następnie wybieramy co ma zostać wyświetlone. key = g.key oznacza że pierwsza kolumna będzie zawierać klucz po jakim zostały pogrupowane dane. Następnie wpisujemy wyrażenie które na s interesuje w naszym przypadku będzie to:
wartosc = g.max(a=>a.unitprice) lub wartosc = g.min(a=>a.unitprice) Wartość tej kolumny to wynik operatora Min/Max wywołanego dla każdego elementu należącego do g. Z tym, że operator Min/Max dostaje w argumencie wyrażenie lambda, które mówi jak porównywać. Cały kod przyjmuje wygląd: var query = from p in dc.products group p by p.categoryid into g select new {key =g.key,wartosc = g.max(a=>a.unitprice)}; i dla wykonania dla g.max() mamy A dla g.min()
3. Ustawienie rekordów względem danej kolumny (rosnąco/malejąco) Celem będzie posortowanie tabeli wzgl danej kolumny. Do przykładu posłużę się tabelą Products. Wyrażenie jest postaci: var query = from p in (tabela) orderby (po kolumnie) descending/ascending select p; Wyrażenie po słowie orderby zawiera nazwę kolumny względem której ma zostać posortowane, descending w kolejności malejącej ascending w kolejności rosnącej W naszym przykładzie przyjmuje ono wygląd var query = from p in dc.products orderby p.productname ascending select p; a po wykonaniu otrzymujemy posortowane dane
4. Dopisanie do danych ciągu znaków w zależności od podanego parametru z kolumny Do zadania wykorzystuje tabele Products. Zadanie polega na dopisaniu ciągu znaków podanego w textboxie do kolumny ProductName w zależności od podanego w kolejnym textboxie progu. Próg ten będziemy sprawdzać w kolumnie UnitsInStock. Czyli np użytkownik poda że chce do nazwy dodać ciąg duzo jeśli w kolumnie UnitsInStock wartość jest większa niż 30. 1. Tworzymy textboxy i przycisk,(w przykładzie textboxy nazwane tbadd i tbprog) 2. W zdarzeniu naciśnięcia przycisku wstawiamy warunek wypełnienia tekstboxów. Np. if ((tbadd.text!= "") && (tbprog.text!= "")) 3. Teraz stworzymy właściwy kod wykonujący nasze zadanie. Po pierwsze musimy stworzyć zapytanie które wybierze właściwe rekordy. var query = from p in dc.products where p.unitsinstock > Int32.Parse(tbprog.Text) select p; w zapytaniu wykorzystujemy zapytanie where po którym musi znaleźć się wyrażenie logiczne u nas jest to porównanie kolumny UnitsInStock z podaną wartością z textboxa zkonwertowaną na typ int. 4. Kolejną czynnością będzie dodanie do każdego wybranego elementu kolumny ProductName wartość wpisanej w pierwszym textboxie. Wykonamy to za pomocą foreach: foreach (var a in query) { dc.products.deleteonsubmit(a); a.productname = a.productname + tbadd.text; dc.products.insertonsubmit(a); } Foreach wykonuje się dla każdego elementu query. Poprzez funkcje DeleteOnSubmit usuwamy dany przez a rekord. Następnie zmieniamy ProductName poprzez dodanie wartości textboxa. Potem dodajemy ten wiersz przez funkcje InsertOnSubmit. 5. Tworzymy zapytanie które pozwoli nam się odwołać do całości tablicy: var kwer = from f in dc.products select f;
6. Przekazujemy wartość do DataGridView. dgwidok.datasource = kwer; 7. Wykonanie zadania daje następujący rezultat: UWAGI: do texboxa gdzie podajemy próg należy dodać warunek przy zdarzeniu wpisywania aby można było wpisywać tylko liczby
5. Wyświetlanie danych ze wzgl. na podany ID Do wyświetlenia posłużymy się nową formą, będziemy wyświetlać dane z tabeli Suppliers. Wykorzystamy texbox do wprowadzania numeru rekordu oraz lebels do wyświetlania. Więc nasza forma może wyglądać tak: Następnie piszemy funkcję, która będzie nam wypełniała danymi z bazy: void zmien_napisy(int numer) { var query = (from p in dc.suppliers where p.supplierid == numer select p); foreach (var a in query) { } } lfirmname.text = a.companyname; ladress.text = a.address; lnamecontact.text = a.contactname; lstan.text = a.contacttitle; lphone.text = a.phone; lpostalcode.text = a.postalcode; lcity.text = a.city; lcountry.text = a.country;
Wybieramy poprzez warunek where p.supplierid == numer rekord który nas interesuje. Następnie dzieki pętli foreach zmieniamy wartości labeli na dane z bazy. Pozostaje tylko dodać stosowne zabezpieczenia textboxa (wprowadzanie liczb) Nasz wynik powinien wyglądać tak UWAGA: W kodzie źródłowym wykonanie funkcji zmien_napis() zostało zawarte w zdarzeniu naciśnięcia klawisza w texboxie.