Gorączka LINQ

W jaki sposób nowe wersje języków C# i VB.Net mogą wpłynąć na produktywność programistów platformy Microsoft .Net i co łączy internetowy sklep Amazon, serwis Flickr i LINQ (Language-INtegrated Query)?

W jaki sposób nowe wersje języków C# i VB.Net mogą wpłynąć na produktywność programistów platformy Microsoft .Net i co łączy internetowy sklep Amazon, serwis Flickr i LINQ (Language-INtegrated Query)?

W 2005 r. Microsoft zaprezentował propozycje rozszerzeń języka C# i VB.Net. Najciekawszym z nich było wprowadzenie zapytań zintegrowanych z językiem programowania LINQ (Language-INtegrated Query). Przez wielu LINQ był mylnie określany jako kolejny O/R (obiektowo-relacyjny) mapper. Powodem tego była składnia przypominająca język , często zmieniające się nazewnictwo oraz chaos związany zwykle z technologiami w fazie CTP (Community Technology Preview).

W praktyce LINQ to mechanizm ułatwiający pracę z danymi po stronie aplikacji. Bez względu na to, czy pochodzą one z bazy danych (LINQ to sql), dokumentów xml (LINQ to xml) czy też zwykłych obiektów (LINQ to objects), zawsze można zastosować na nich takie operacje, jak projekcje lub złączenia. Składnia zapytań LINQ oraz dostępne operacje są zbliżone do SQL, dzięki czemu nauka LINQ nie przysparza trudności nawet początkującym programistom technologii .Net.

Idea LINQ jest oparta na dwóch prostych interfejsach: IEnumerable (implementowany przez wszystkie kolekcje .Net Framework), umożliwia "odpytywanie" danych; IQueryable - określa zestaw operacji, jakie musi implementować klasa przetwarzająca zapytanie. Można dzięki nim implementować nowe źródła danych, które tworzą kolejną warstwę abstrakcji dla usług webowych lub już istniejących api. Z punktu widzenia programisty prowadzi to niewątpliwie do uproszczenia procesu pobierania danych.

Interesujący jest fakt, że pomimo niekompletnej dokumentacji dostarczanej wraz z wersją CTP i Beta 1 Visual Studio Orcas (nowej wersji IDE w pełni wspierającego LINQ) już powstają przykładowe implementacje takich źródeł danych, jak projekty LINQ to Amazon, LINQ to Flickr lub LINQ to LDAP.

Wynika to m.in. z tego, że serwisy Amazon i Flickr udostępniają api umożliwiające dostęp do części oferowanych przez nich funkcjonalności (np. wyszukiwanie książek, zdjęć). Dlatego też podobnie jak Google Maps stały się one podstawą dla wielu serwisów internetowych typu mashup (łączących funkcjonalności kilku niezależnych serwisów w całość).

LINQ to Amazon

Projekt LINQ to Amazon pozwala (przynajmniej na razie) jedynie na proste wyszukiwanie książek oferowanych w sklepie internetowym. Za kulisami wykorzystywany jest interfejs REST (zapytanie do serwisu ma postać adresu url, po którego wywołaniu dostajemy wyniki w formacie xml). Otrzymany xml jest parsowany za pomocą LINQ to xml, a następnie wyniki tej operacji są zwracane w postaci kolekcji obiektów biznesowych.

Cały proces przebiegający od wysłania zapytania do zwrócenia wyników jest dość skomplikowany. Wymaga on bowiem od programisty znajomości kontraktu usługi i umiejętności parsowania dokumentów xml lub obycia z już napisaną przez kogoś biblioteką. Choć sam LINQ nie realizuje tego zadania, może znacznie uprościć korzystanie z takiego źródła danych.

Oto przykład wyszukiwania książek za pomocą LINQ to Amazon, które spełniają następujące kryteria:

  • cena jest mniejsza niż 30 USD
  • tytuł zawiera ciągi "ASP" i ".Net"

[Kod C#]

var books = from book in new BookSearch ()

where (book.Title.Contains (".NET")) && (book.Title.Contains ("ASP")) && (book.Price < 30)

select book;

LINQ to Flickr

Projekt LINQ to Flickr prezentuje odmienne podejście. Jest on oparty na gotowej bibliotece Flickr.Net (http://www.codeplex.com ), która pozwala na dostęp do usługi webowej serwisu Flickr (http://www.flickr.com ). Warto zadać sobie pytanie - co da stworzenie kolejnego wrappera (nakładki) dla tej usługi?

Otóż w porównaniu z przykładami użycia Flickr.Net okazuje się, że zaprezentowany niżej kod jest o wiele krótszy i nie wymaga od programisty dogłębnej znajomości tej biblioteki:

[Kod C#]

var photos = from i in new PhotoQuery ("...")

where i.Tags == "Mazury"

select i;

LDAP, Oracle, PostgreSQL i MySQL

Kolejnym ciekawym rozwiązaniem jest LINQ to LDAP (Lightweight Directory Access Protocol). W tym przypadku autor projektu idzie krok dalej i dostarcza narzędzie pozwalające na silnie typowany dostęp do usługi katalogowej. Choć LINQ to LDAP nie wpłynie znacząco na popularność istniejących narzędzi związanych z wyszukiwaniem obiektów usługi katalogowej (głównie ze względu na jego eksperymentalny charakter), pozwala docenić potencjał i pomysłowość społeczności programistów .Net.

Niewątpliwie najbardziej oczekiwanym rodzajem LINQ jest LINQ to sql (LINQ pozwalający na dostęp do bazy danych). Początkowe oświadczenia Microsoft, że LINQ to sql ma wspierać tylko SQL Server, spotkały się z dużym niezadowoleniem osób korzystających z innych systemów. Pewnie dlatego już teraz trwają prace nad implementacjami wspierającymi takie systemy bazodanowe, jak Oracle, PostgreSQL lub MySQL. Czyżbyśmy mieli do czynienia z początkiem końca "niezależnych" O/R mapperów na platformie .Net?

LINQ, Orcas - czy warto?

Nowe rozszerzenia języków VB.NET i C# znacznie uproszczą życie programistów pracujących na platformie Microsoftu. Do zwiększenia produktywności deweloperów głównie przyczyni się LINQ to sql. Jak zapowiada producent, w niektórych przypadkach pozwoli on zmniejszyć nawet o 40% ilość kodu niezbędnego do stworzenia warstwy dostępu do danych.

Aby móc w pełni korzystać z tych nowości, trzeba będzie jednak zamienić aktualne środowisko programistyczne na Visual Studio Orcas lub jego pochodne (np. jego wersje Express dla hobbystów i pasjonatów).

Co dalej?

Wszystko wskazuje na to, że "gorączkę LINQ" mamy dopiero przed sobą. Niektórzy deweloperzy już przewidują problemy związane ze złączeniami czy filtrowaniem ogromnych kolekcji danych przechowywanych w pamięci. Jedną z prób rozwiązania tego problemu prezentuje projekt i4o (indexes for objects,http://www.codeplex.com ), który wprowadza koncepcję… indeksów dla kolekcji!

Anders Hejlsberg - szef zespołu odpowiedzialnego w Microsoft za rozwój języka C# przewiduje, że w przyszłości rozwiązania zbliżone do LINQ będą obecne w każdym nowoczesnym języku programowania. Co ciekawe, pierwszą deklarację wprowadzenia podobnych zmian zgłosił jeszcze w 2005 r. jeden z inżynierów firmy Borland.

Rewolucja LINQ

LINQ to sql - bezpośredni dostęp do bazy danych MS SQL Server

LINQ to xml - nowe, uproszczone podejście do obsługi dokumentów xml

LINQ to objects - "odpytywanie" kolekcji i obiektów

LINQ to ADO.Net - wsparcie dla już istniejącego kodu warstwy dostępu do danych

LINQ to Entities - współpraca ze złożonymi obiektami biznesowymi


TOP 200