LINQ to dostępna od .NET Framework 3.5 metoda dostępu do danych. LINQ to nie tylko składnia umożliwiająca tworzenie zapytań na wzór tych z SQL, ale też sposób na dostęp do wszelkich list danych, obiektów, plików xml -  inaczej mówiąc, linq umożliwia skorzystanie z dowolnego źródła danych i wykonanie na nich podstawowych operacji takich jak: select, insert, update, delete oraz oczywiście wiele innych bardziej zaawansowanych.  Linq umożliwia także formatowanie otrzymanych wyników w dowolną formę oraz bardzo proste manipulowanie wynikami zapytań. Linq jest wspierane w pełni przez edytor Visual Studio, wraz z intellisense czy debuggerem, co znacznie poprawia wydajność pracy. Jednak typowym zastosowaniem linq jest jego użycie w modelu LINQ TO SQL.

Linq to Sql jest narzędziem typu O/RM, które umożliwia wymodelowanie relacyjnej bazy danych używając do tego klas platformy .NET.  Następnie takiego modelu można użyć do pobierania/aktualizowania/wstawiania/usuwania danych z bazy.

Linq to Sql w pełni wspiera transakcje,  widoki oraz procedury składowe; umożliwia także łatwą integrację zasad biznesowych oraz walidacji danych.

Najważniejszym pytaniem jest jednak, po co mi linq to sql? Otóż linq to sql czy linq znacznie skraca tworzenie warstwy dostępu do danych, nie trzeba już tworzyć zapytań SQL, nie trzeba już tworzyć procedur składowych, oczywiście można to wszystko tworzyć, ale sensem linq jest to, aby właśnie tego nie robić. Wiele początkujących programistów tworzy zazwyczaj witryny prywatne, strony „wizytówki”, proste witryny cms, na co dzień nie zajmują się profesjonalnymi serwisami, które wymagają jak najbardziej wydajnego dostępu do danych i stosowaniu wysoce zoptymalizowanych zapytań, tu właśnie sprawdza się linq, dla małej czy średniej witryny/serwisu dodatkowy narzut związany z użyciem linq nie jest aż tak ważny. O jakim narzucie piszę ? Linq generuje zapytania podczas działania strony, a co za tym idzie zużywa dodatkowy czas na ich wygenerowanie, w większości zastosowań zapytania linq są wolniejsze do około 10% niż zwykły sql, natomiast zaletą jest to, że dostęp do danych poprzez użycie linq robi się ponad 50% szybciej. Jest to oczywiście sprawa wyboru każdego programisty co zastosować i co jest konieczne, jednak w większości przypadków linq jest dobrym wyborem, można używać linq także w profesjonalnych dużych witrynach jednak w takim wypadku wymagane jest dogłębne poznanie działania linq oraz poznanie wszelkich klas oraz właściwości linq, które można wykorzystać, aby maksymalnie podnieść wydajność tego rozwiązania, jednak ten artykuł nie będzie poruszał tych kwestii, gdyż jest kierowany dla początkujących.

Myślę, że po tym krótkim wprowadzeniu najlepiej pokazać najprostszy możliwy sposób stworzenia modelu linq to sql i wykonaniu na nim podstawowych zapytań linq.

W podanych przykładach została wykorzystana przykładowa baza od Microsoft o nazwie Northwind, którą można pobrać pod adresem http://code.msdn.microsoft.com/northwind/Release/ProjectReleases.aspx?ReleaseId=1401

Aby skorzystać z linq to sql, należy w Visual studio utworzyć stronę ASP.NET z użyciem .net 3.5 (linq jest dostępny od wersji 3.5), następnie należy dodać do projektu plik -  LINQ to SQL Classes o rozszerzeniu .dbml. Po dodaniu pliku należy otworzyć podgląd bazy w Visual Studio oraz przeciągnąć na otwartą powierzchnię pliku .dbml w edytorze wybrane przez nas tabele, w tym przypadku będą to Product, Category, Order oraz OrderDetail, całość wygląda tak:

 

Po zapisaniu pliku .dbml ( tu data.dbml) zostaną utworzone dla nas automatycznie klasy dostępu do danych, które widać na obrazku poniżej.

 

Jak widać klasy mają nazwy odpowiednich tabeli, jednak tak naprawdę klasy odpowiadają za jeden element z tabeli, a nie za nią całą. Najważniejszą jednak klasą jest klasa pochodna od DataContext, u nas dataDataContext (utworzona od nazwy pliku .dbml). Jest to najważniejsza klasa gdyż łączy całość klas tabel wygenerowanych z bazy oraz łączy je w całość umożliwiając także wszelkie operacje na danych o czym przekonamy się za chwilę.


Teraz, gdy już mamy wszystko co trzeba pokażę kilka przykładów podstawowych zapytań linq.
Gdy korzystamy z linq to sql podstawową czynnością jest inicjalizacja klasy DataContext (u nas dataDataContext).

1. Pobieranie produktów z bazy, czyli standardowy select.

dataDataContext db = new dataDataContext();

 

var dane = from p in db.Products select p;

 

Zapytanie pobiera wszystkie produkty.

 

2. Pobieranie produktów z bazy z filtrowaniem, czyli standardowy select z where.

dataDataContext db = new dataDataContext();

 

var dane = from p in db.Products

where p.Categories.CategoryName == "AGD"

select p;

Tutaj widać, pobranie tylko tych rekordów w, których kategoria  to „AGD”.

 

3. Aktualizacja danych w bazie (pojedynczego rekordu), czyli standardowy update( tu aktualizacja ceny).

dataDataContext db = new dataDataContext();

 

Products product = db.Products.Single(p => p.ProductName == "Plazma TV");

 

product.UnitPrice = 4500;

 

db.SubmitChanges();

Tutaj może małe wytłumaczenie, Single oznacza pobranie jednego rekordu, tu akurat produktu o nazwie „Plazma TV”, następnie wykonujemy zmianę ceny i zapisujemy zmiany dzięki SubmitChanges.
Ważne jest to, że całe zapytanie wraz z zapisem, czyli w tym przypadku aktualizacją jest wykonywane dopiero po wywołaniu SubmitChanges i nie wcześniej. Może dziwić także fakt, że najpierw trzeba pobrać rekord, aby go zmienić, jest to typowe dla linq i da się to zmienić, jednak ten artykuł tego tematu nie porusza, gdyż jest to bardziej zaawansowane zadanie.

4. Dodanie nowej kategorii oraz produktów, czyli standardowy insert.

dataDataContext db = new dataDataContext();

 

Categories category = new Categories()

{

    CategoryName = "Zabawki"

};

 

Products product1 = new Products()

{

    ProductName = "Tuner"

};

 

Products product2 = new Products()

{

     ProductName = "DVD"

};

 

category.Products.Add(product1);

category.Products.Add(product2);

 

db.Categories.InsertOnSubmit(category);

Dodajemy kategorię, do kategorii 2 produkty i dodajemy kategorię z produktami poprzez InsertOnSubmit. Tu także operacja jest wykonywana po wywołaniu dopiero ostatniej funkcji, dodatkowo linq to sql automatycznie tworzy relacje PK/FK dzięki czemu możemy dodać do kategorii produkty od razu.

5. Usuwanie danych z bazy, czyli standardowy delete.

dataDataContext db = new dataDataContext();

 

var dokasacji = from p in db.Products

                where p.UnitsInStock == 0

                select p;

 

db.Products.DeleteAllOnSubmit(dokasacji);

db.SubmitChanges();

Najpierw „zaznaczmy” (zapytanie wykonywane jest po zatwierdzeniu!) wszystkie produkty, których już nie ma na magazynie i następnie usuwamy je wszystkie z bazy.

6. Stronicowanie danych (paging). Zapytanie bardziej zaawansowane.

dataDataContext db = new dataDataContext();

 

var produkty = (from p in db.Products

select p).Skip(100).Take(25);

Jedną z technik podnoszenia wydajności aplikacji www jest pobieranie danych w tzw. stronach, czyli np. popularne przeglądanie komentarzy, produktów itp. podzielone na strony. Dzięki temu pobierane są tylko te dane, które chcemy aktualnie zobaczyć, a nie wszystkie co odciąża w dużym stopniu bazę danych, jednak technika ta nie jest taka całkiem prosta do zrealizowania poprzez standardowy sql, aczkolwiek z linq jest to bardzo proste, co pokazuje powyższy przykład. Funkcja Skip oznacza „pomiń”, a funkcja Take „pobierz”, powyższe zapytanie pomija 100 rekordów, a następnie pobiera ich 25, zwracając tym samym ich listę .

 

 

 

Jak widać linq to bardzo ciekawa technologia, oczywiście jest to tylko krótkie wprowadzenie do tego tematu jednak myślę, że każdy kto jeszcze nie miał styczności z tą technologią po przeczytaniu tego artykułu zacznie się zastanawiać, czy nie zastosować linq w swoich aplikacjach www i tym samym przyspieszyć ich powstawanie, poprzez przedstawioną tu prostotę używania linq.