Wstęp

Artykuł ten jest wprowadzeniem do zapytań wykonanych przy użyciu języka LINQ. Język ten pozwala nam na swobodną pracę z kolekcjami, tj. ich edycję, filtrowanie czy przeszukiwanie. Takie operacje można z łatwością wykonywać pracując z bazami danych jednakże podstawowe operację dostarczane przez przez interfejsy w języku C# są raczej ubogie. Korzystając jednak z technologii .NET od wersji 3.5 można skorzystać ze wspomnianej wyżej technologii, tj. LINQ.

Przejdźmy do przykładów, które są zdecydowanie bardziej pomocne. Poniżej zostaną przedstawione operacje:

  • prosty Select;
  • Select wraz z klauzurą Where;
  • tworzenie uporządkowanej listy;
  • współpraca z typami niestandardowymi;
  • przeszukiwanie List<T>;
  • przeszukiwanie List<T> i zwrócenie pojedycznego wyniku.


Select

Poniżej najprosty przykład użycia klauzuli Select:

using System;
using System.Linq;
namespace LINQtoObject
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy tablicę samochodów - to jest nasza kolekcja
            string[] cars = { "Audi", "Porsche", "Pagani", "BMW", "Nissan", "Lamborghini" };
            // używamy LINQ aby zwrócić wszystkie elementy naszej kolekcji
            var list = from c in cars
                       select c;
            // wypisanie w konsoli wszystkich elementów
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}
W powyższym przykładzie tworzymy zmienną var dla naszej listy. Przyjmie ona typ zwracanych danych. Powyższy przykład może nie jest idealny ponieważ moglibyśmy dokonać iteracji na naszej tablicy a nie liście zwróconej przez LINQ. To jednak najprostszy przykład, który w kolejnych krok będzie coraz bardziej komplikowany a wówczas zobaczycie potrzebę użycia LINQ.


Select wraz z klauzulą Where

Następny przykład zapytania przygotowanego w LINQ będzie dodatkowo zawierał klauzulę Where. Zdefiniujemy tablicę naszych danych początkowych a kolejnym krokiem będzie zwrócenie danych zaczynających się od wskazanej litery:

using System;
using System.Linq;
namespace LINQtoObjectWhere
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy tablicę samochodów - to jest nasza kolekcja
            string[] cars = { "Audi", "Porsche", "Pagani", "BMW", "Nissan", "Lamborghini", "Mercedes",
            "Alfa Romeo", "Maserati", "Panoz", "Peugeot", "Pontiac"};
            // używamy LINQ aby zwrócić elementy naszej kolekcji, które zaczynają się od litery 'P'
            var list = from c in cars
                       where c.StartsWith("P")
                       select c;
            // wypisanie w konsoli wszystkich elementów
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}


Select wraz z klauzulą Where

Niewielka zmiana powyższego przykładu, w tym przypadku klauzula Where zostanie użyta do odnalezienia dokładnego dopasowania:

using System;
using System.Linq;
namespace LINQtoObjectWhereExact
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy tablicę samochodów -to jest nasza kolekcja
            string[] cars = { "Audi", "Porsche", "Pagani", "BMW", "Nissan", "Lamborghini", "Mercedes",
            "Alfa Romeo", "Maserati", "Panoz", "Peugeot", "Pontiac"};
            // używamy LINQ aby zwrócić elementy naszej kolekcji, które zaczynają się od litery 'P'
            var list = from c in cars
                       where c == "Maserati"
                       select c;
            // wypisanie w konsoli wszystkich elementów (tym razem mamy jedno dopasowanie)
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}


Tworzenie uporządkowanej listy

W poniższym przykładzie zwrócimy dane uporządkowane wg. liter alfabetu:

using System;
using System.Linq;
namespace LINQtoObjectOrderedList
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy tablicę samochodów - to jest nasza kolekcja
            string[] cars = { "Audi", "Porsche", "Pagani", "BMW", "Nissan", "Lamborghini", "Mercedes",
            "Alfa Romeo", "Maserati", "Panoz", "Peugeot", "Pontiac"};
            // używamy LINQ aby zwrócić uporządkowane dane z powyższej tablicy
            var list = from c in cars
                       orderby c ascending
                       select c;
            // wypisanie w konsoli wszystkich elementów (tym razem mamy jedno dopasowanie)
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}


Praca z typem niestandardowym

W tym przykładzie zostanie utworzona typowana lista, dodamy kolejne dane a następnie użyjemy LINQ, aby zwrócić wybrane dane:

using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQtoObjectCustomTypes
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy listę obiektów typu Car
            List<Car> list = new List<Car>();
            Car car1 = new Car();
            car1.Id = 1;
            car1.Brand = "Audi";
            car1.Model = "RS6";
            Car car2 = new Car();
            car2.Id = 2;
            car2.Brand = "BMW";
            car2.Model = "M3";
            Car car3 = new Car();
            car3.Id = 3;
            car3.Brand = "Pagani";
            car3.Model = "Zonda";
            Car car4 = new Car();
            car4.Id = 4;
            car4.Brand = "Nissan";
            car4.Model = "GTR";
            // wszystkie obiekty dodajemy do listy
            list.Add(car1);
            list.Add(car2);
            list.Add(car3);
            list.Add(car4);
            // A dla przypomnienia inny sposób dodawania danych do listy
            list.Add(new Car { Id = 5, Brand = "Pontiac", Model = "GTO" });
            // używamy LINQ aby zwrócić uporządkowane dane z powyższej listy
            // sortowanie odbywa się po marce
            var sortedList = from l in list
                             orderby l.Brand ascending
                             select l;
            // wypisanie w konsoli wszystkich elementów
            foreach (var item in sortedList)
            {
                Console.WriteLine(item.Brand + " " + item.Model);
            }
            Console.ReadKey();
        }
    }
    class Car
    {
        public int Id { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
    }
}


Przeszukiwanie List

W powyższym przykładzie została utworzona i wypełniona typowana lista. W poniższym przykładzie użyjemy klauzuli Where, aby zwrócić dane zaczynające się od wskazanej litery:

using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQtoObjectSearchingListT
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy listę obiektów typu Car
            List<Car> list = new List<Car>();
            Car car1 = new Car();
            car1.Id = 1;
            car1.Brand = "Audi";
            car1.Model = "RS6";
            Car car2 = new Car();
            car2.Id = 2;
            car2.Brand = "BMW";
            car2.Model = "M3";
            Car car3 = new Car();
            car3.Id = 3;
            car3.Brand = "Pagani";
            car3.Model = "Zonda";
            Car car4 = new Car();
            car4.Id = 4;
            car4.Brand = "Nissan";
            car4.Model = "GTR";
            // wszystkie obiekty dodajemy do listy
            list.Add(car1);
            list.Add(car2);
            list.Add(car3);
            list.Add(car4);
            // A dla przypomnienia inny sposób dodawania danych do listy
            list.Add(new Car { Id = 5, Brand = "Pontiac", Model = "GTO" });
            // używamy LINQ aby zwrócić dane zaczynające się od litery P
            var searching = from l in list
                            where l.Brand.StartsWith("P")
                            select l;
            // wypisanie w konsoli wszystkich elementów
            foreach (var item in searching)
            {
                Console.WriteLine("Id: " + item.Id + ", " + item.Brand + " " + item.Model);
            }
            Console.ReadKey();
        }
    }
    class Car
    {
        public int Id { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
    }
}


Przeszukiwanie List i zwrócenie pojedycznego wyniku

W poniższym przykładzie zwrócimy pojedynczy rezultat:

using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQtoObjectSearchingListTSingleResult
{
    class Program
    {
        static void Main(string[] args)
        {
            // tworzymy listę obiektów typu Car
            List<Car> list = new List<Car>();
            // użyjemy skróconego zapisu z poprzedniego przykładu
            list.Add(new Car { Id = 1, Brand = "Audi", Model = "RS6" });
            list.Add(new Car { Id = 2, Brand = "BMW", Model = "M3" });
            list.Add(new Car { Id = 3, Brand = "Pagani", Model = "Zonda" });
            list.Add(new Car { Id = 4, Brand = "Nissan", Model = "GTR" });
            list.Add(new Car { Id = 5, Brand = "Pontiac", Model = "GTO" });
            // używamy LINQ aby zwrócić dokładnie jeden rekord
            var singleResult = from l in list
                               where l.Id == 5
                               select l;
            // wypisanie w konsoli wszystkich elementów (tym razem mamy jedno dopasowanie)
            foreach (var item in singleResult)
            {
                Console.WriteLine("Id: " + item.Id + ", " + item.Brand + " " + item.Model);
            }
            // inny sposób użycia LINQ, zwracamy konkretny typ
            var singleResult2 = (from l in list
                                 where l.Id.Equals(3)
                                 select l).Single<Car>();
            // wypisanie w konsoli znalezionego rezultatu
            Console.WriteLine("Id: " + singleResult2.Id + ", " + singleResult2.Brand + " " + singleResult2.Model);
            Console.ReadKey();
        }
    }
    class Car
    {
        public int Id { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
    }
}