poniedziałek, 4 stycznia 2010

SQL-owe LIKE w LINQ

Pisząc aplikację chciałem wypróbować możliwości dające mapowanie tabel z bazy danych na obiekty. Skorzystałem z technologi LINQ która została przedstawiona w .NET 3.5. Problemem na jaki się natknąłem było użycie operatora LIKE znanego z SQLa. Zapytania:

SELECT imie, nazwisko
FROM Osoba
WHERE imie LIKE ‘%an’

SELECT imie, nazwisko
FROM Osoba
WHERE imie LIKE ‘an%’

SELECT imie, nazwisko
FROM Osoba
WHERE imie LIKE ‘%an%’



są często stosowane tam, gdzie użytkownik szuka jakiejś konkretnej informacji ale nie zna jej pełnej nazwy. LINQ nie zawiera w swojej składni operatora like, można natomiast wykorzystać funkcje działające na łańcuchach.


1. StartsWith("string"):

            var q = from a in db.Osobas
                    where a.Imie.StartsWith("pa")
                    select a.Imie;
 
Wyrażenie to wygeneruje następujące zapytanie do bazy danych:
SELECT [t0].[Imie]
FROM [dbo].[Osoba] AS [t0]
WHERE [t0].[Imie] LIKE 'pa%'
 
2. EndsWith("string")
 
 
            var q = from a in db.Osobas
                    where a.Imie.EndsWith("pa")
                    select a.Imie;
 
Wyrażenie to wygeneruje następujące zapytanie do bazy danych:
SELECT [t0].[Imie]
FROM [dbo].[Osoba] AS [t0]
WHERE [t0].[Imie] LIKE '%pa'
 
3. Contains("string")
 
            var q = from a in db.Osobas
                    where a.Imie.Contains("pa")
                    select a.Imie;
  
Wyrażenie to wygeneruje następujące zapytanie do bazy danych:
SELECT [t0].[Imie]
FROM [dbo].[Osoba] AS [t0]
WHERE [t0].[Imie] LIKE '%pa%'

Jak więc widać mamy całą gamę funkcji dzięki którym możemy w łatwy sposób generować zapytania do bazy danych z wykorzystaniem operatora LIKE.


Istnieje jeszcze jeden sposób wykorzystania tego operatora. Dla niektórych może się on wydać bardziej "naturalny" od wykorzystywania funkcji.

Dodając do naszego projektu przestrzeń:
using System.Data.Linq.SqlClient;
Uzyskujemy dostęp do kilku przydatnych funkcji w klasie 
SqlMethods
 Przykład:
 
            var q = from a in db.Osobas
                    where SqlMethods.Like(a.Imie, "p_o%")
                    select a.Imie;
 

  
Tak skonstruowane zapytanie pozwoli nam wyszukać wszystkie wyrazy których pierwsza litera to p, druga dowolna, trzecia o a kolejne dowolne. Czyż to nie proste?