Language Integrated Query bo takie jest rozwinięcie skrótu LINQ to język zapytań wbudowany w C#. Pozwala on na bardzo wygodne operowanie na danych pochodzących z różnych źródeł (kolekcji, SQL, XML). Dzięki podobieństwu do SQL jest łatwy do opanowania przez osoby znające SQL (tak samo używa Select, Where itp.).
Dzięki LINQ w łatwy sposób możemy filtrować kolekcje według określonych kryteriów, porządkować, grupować itp.
Mając do czynienia z kolekcją obiektów możemy jednym zapytaniem wybrać te, które spełniają określone przez nas kryteria. Możemy to zrobić praktycznie w jednej linijce kodu bez tworzenia skomplikowanych konstrukcji for/if.
Przykłady zamieszczone tutaj opierać będą się na kolekcji obiektów klasy Person (nieśmiertelne rozwiązanie, które oprócz Car z lubością jest stosowane).
Kod klasy Person:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LINQ { public class Person { public string Imie { get; set; } public string Nazwisko { get; set; } public int Wiek { get; set; } public Person (string imie, string nazwisko, int wiek) { this.Imie = imie; this.Nazwisko = nazwisko; this.Wiek = wiek; } public override string ToString() { string stringOsoba = this.Imie + " " + this.Nazwisko + " " + this.Wiek; return stringOsoba.ToString(); } } }
Tworzymy kolekcję danych – kolekcję obiektów klasy Person:
List<Person> osoby = new List<Person>();
I wypełniamy ją danymi:
osoby.Add(new Person("Olga", "Lis", 19)); osoby.Add(new Person("Rafał", "Kieres", 46)); osoby.Add(new Person("Jan", "Nowak", 24)); osoby.Add(new Person("Ewelina", "Nidalska", 50)); osoby.Add(new Person("Marlena", "Pyszna", 19)); osoby.Add(new Person("Janusz", "Kowalski", 75)); osoby.Add(new Person("Eleonora", "Jankowska", 50)); osoby.Add(new Person("Kinga", "Bojarska", 34)); osoby.Add(new Person("Iza", "Bajorek", 39)); osoby.Add(new Person("Marek", "Torański", 35)); osoby.Add(new Person("Adam", "Lisowski", 56)); osoby.Add(new Person("Michał", "Szynka", 14)); osoby.Add(new Person("Szymon", "Dudek", 22));
No i teraz mając do dyspozycji kolekcję danych – osoby, możemy operować na niej w celu wyciągnięcia interesujących nas danych.
Jeśli chcemy zobaczyć wszystkie osoby w kolekcji to jak widać nie musimy używać LINQ.
private void ShowAllPersonsUnsorted() { Console.WriteLine("\nOsoby nieposortowane"); Console.WriteLine("---------------------------"); foreach (var item in osoby) { Console.WriteLine(item.ToString()); } }
Jeśli chcemy zobaczyć wszystkie osoby w kolekcji posortowane po nazwisku to już z pomocą przychodzi nam LINQ (korzystamy z zapisu skróconego).
private void ShowAllPersonsSortedBySurname() { var qry = osoby.OrderBy(n=>n.Nazwisko); Console.WriteLine("\nOsoby posortowane po nazwisku"); Console.WriteLine("---------------------------"); foreach (var item in qry) { Console.WriteLine(item.ToString()); } }
No a teraz chcemy posortować naszą kolekcję po wieku od najstarszych do najmłodszych. Też skorzystamy z LINQ z tym, że tym razem dodamy porządek malejący „Reverse()”.
private void ShowAllPersonsSortedByAge() { var qry = osoby.OrderBy(n => n.Wiek).Reverse(); Console.WriteLine("\nOsoby posortowane po wieku - od najstarszych"); Console.WriteLine("---------------------------"); foreach (var item in qry) { Console.WriteLine(item.ToString()); } }
Sortujemy naszą kolekcję po imieniu osoby. Tak samo jak poprzednio używamy LINQ. Jak widać sortowanie odbywa się przez użycie „OrderBy” podobnie jak w SQL.
private void ShowPersonsSortedByName() { var qry = osoby.OrderBy(n => n.Imie); Console.WriteLine("\nOsoby posortowane po imieniu"); Console.WriteLine("---------------------------"); foreach (var item in qry) { Console.WriteLine(item.ToString()); } }
Kolejnym krokiem niech będzie wyszukanie osób z nazwiskiem dłuższym niż „liczbaZnakow” znaków. Skorzystamy z metody:
private void ShowPersonsWithSurnameLongerThan(int liczbaZnakow) { var qry = osoby.Select(a => a).Where(n => n.Nazwisko.Length > liczbaZnakow); Console.WriteLine("\nOsoby z nazwiskiem dłuższym niż: {0}", liczbaZnakow); Console.WriteLine("---------------------------"); foreach (var item in qry) { Console.WriteLine(item.ToString()); } }