Udostępnij za pośrednictwem


Wprowadzenie do kwerend LINQ (C#)

Zapytanie jest wyrażeniem, które pobiera dane ze źródła danych.Zapytania są zwykle wyrażane w specjalistycznym języku zapytań.Różne typy źródeł danych, na przykład SQL dla relacyjnych baz danych i XQuery dla XML, zostały opracowane w różnych językach.Dlatego programiści musieli nauczyć się nowego języka zapytań dla każdego typu źródła danych lub formatu danych, które muszą być w stanie obsługiwać.LINQ upraszcza tę sytuację oferując spójny model do pracy z danymi w różnych rodzajach formatów i źródeł danych.W zapytaniu programu LINQ zawsze pracujesz z obiektami.Używasz tych samych podstawowych schematów kodowania do pytania o dane i przekształcenia ich w dokumentach XML, bazach danych SQL, zestawach danych ADO.NET, kolekcjach .NET i innych formatach, do których dostępny jest dostawca LINQ.

Trzy części operacji zapytania

Wszystkie operacje kwerendy LINQ składają się z trzech odrębnych czynności:

  1. Uzyskaj źródło danych.

  2. Utwórz zapytanie.

  3. Wykonaj zapytanie.

Poniższy przykład ukazuje, jak trzy części operacji zapytania są wyrażone w kodzie źródłowym.W przykładzie użyto tablicy liczb całkowitych jako źródła danych dla wygody; jednak te same pojęcia dotyczą również innych źródeł danych.Przykład ten jest wspominany do końca tego tematu.

class IntroToLINQ
{        
    static void Main()
    {
        // The Three Parts of a LINQ Query: 
        //  1. Data source. 
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation. 
        // numQuery is an IEnumerable<int> 
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution. 
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }
    }
}

Poniższa ilustracja przedstawia pełną operację zapytania.W programie LINQ wykonanie zapytania jest oddzielone od samego zapytania; innymi słowy nie pobrano żadnych danych tylko przez utworzenie zmiennej zapytania.

Zakończ operację zapytania LINQ

Źródło danych

W poprzednim przykładzie ponieważ źródło danych jest tablicą, niejawnie obsługuje ogólny interfejs IEnumerable.Fakt ten oznacza możliwość zapytania z LINQ.Zapytanie jest wykonywane według instrukcji foreach, a foreach wymaga IEnumerable lub IEnumerable.Typy obsługujące IEnumerable lub interfejs pochodny, takie jak typowa IQueryable są nazywane typami odpytywalnymi.

Typ odpytywalny nie wymaga modyfikacji ani specjalnego traktowania, aby służyć jako LINQ źródło danych.Jeśli źródło danych nie jest jeszcze w pamięci jako typ odpytywalny, dostawca programu LINQ musi reprezentowania je jako takie.Na przykład narzędzie LINQ do XML ładuje dokument XML do odpytywalnego typu XElement:

// Create a data source from an XML document. 
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

Dzięki LINQ do SQL, tworzysz mapowanie związane z obiektem w czasie projektowania lub ręcznie lub za pomocą Object Relational Designer (O/R Designer).Piszesz zapytania dotyczące obiektów, a w czasie wykonywania LINQ do SQL obsługuje komunikację z bazą danych.W poniższym przykładzie obiekt Customers reprezentuje określoną tabelę w bazie danych, a typ wyniku zapytania IQueryable pochodzi z obiektu IEnumerable.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

// Query for customers in London.
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

Aby uzyskać więcej informacji dotyczących sposobu tworzenia określonych typów źródeł danych, zobacz dokumentację dla różnych dostawców w programie LINQ.Podstawowa zasada jest jednak bardzo prosta: źródłem danych programu LINQ jest dowolny obiekt obsługujący ogólny interfejs IEnumerable interfejsu lub interfejs, który dziedziczy z niego.

[!UWAGA]

Typy takie jak ArrayList, który obsługuje niepodstawowy interfejs IEnumerable można również stosować jako źródło danych LINQ.Aby uzyskać więcej informacji, zobacz Porady: zapytanie w ArrayList za pomocą LINQ.

Zapytanie

Zapytanie określa, jakie informacje należy pobrać ze źródła lub źródeł danych.Opcjonalnie zapytanie określa również, jak te informacje powinny być sortowane, grupowane i kształtowane przed zwróceniem.Zapytanie jest przechowywane w zmiennej zapytania i inicjowane za pomocą wyrażenia zapytania.Aby ułatwić zapisywanie zapytań, język C# wprowadził nową składnię zapytań.

Zapytanie w poprzednim przykładzie zwraca wszystkie liczby parzyste z tablicy liczb całkowitych.Wyrażenie zapytania zawiera trzy klauzule: from, where i select. (Użytkownicy, którzy znają język SQL, zauważą, że zamawianie klauzul działa odwrotnie niż zamówienia w języku SQL). Klauzula from określa źródło danych, klauzula where nakłada filtr, a klauzula select określa typ zwracanych elementów.Te i inne klauzule zapytania zostały szczegółowo omówione w sekcji Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#).Teraz istotną kwestią jest to, że w programie LINQ sama zmienna zapytania nie podejmuje żadnych działań i nie zwraca żadnych danych.Po prostu przechowuje informacje, które są wymagane w celu uzyskania wyników, gdy zapytanie jest wykonywane w pewnym momencie później.Aby uzyskać więcej informacji dotyczących sposobu tworzenia zapytań w tle, zobacz Standardowe operatory zapytań — Omówienie.

[!UWAGA]

Zapytania można również wyrażać za pomocą składni metody.Aby uzyskać więcej informacji, zobacz Składnia zapytania i metody w technologii LINQ (C#).

Wykonywanie zapytania

Wykonanie odroczone

Jak wspomniano wcześniej, zmienna kwerendy przechowuje tylko polecenia kwerendy.Rzeczywiste wykonanie zapytania jest odroczone do czasu iteracji nad zmienną kwerendy w instrukcji foreach.Koncepcja ta jest nazywana wykonaniem odroczonym i została przedstawiona w poniższym przykładzie:

//  Query execution.  
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

Instrukcja foreach to również miejsce, gdzie pobierane są wyniki zapytania.Na przykład w poprzednim zapytaniu zmienna iteracji num przechowuje każdą wartości (jedną na raz) w zwracanej sekwencji.

Ponieważ sama zmienna kwerendy nigdy nie przechowuje wyników kwerendy, można wykonywać ją tak często, jak chcesz.Na przykład można mieć bazę danych, który jest stale aktualizowana przez oddzielną aplikację.W aplikacji można utworzyć jedno zapytanie, które pobiera najnowsze dane, i można je wykonać wielokrotnie z pewnym interwałem w celu pobierania różnych wyników za każdym razem.

Wymuszanie natychmiastowego wykonania

Zapytania, które wykonują funkcje agregacji w zakresie elementów źródła najpierw muszą przejść przez te elementy.Przykłady takich zapytań to Count, Max, Average i First.Działają one bez wyraźnej instrukcji foreach ponieważ samo zapytanie musi użyć foreach w celu zwrócenia wyników.Należy również zauważyć, że te typy zapytań zwracają jedną wartość, nie kolekcji IEnumerable.Następujące zapytanie zwraca liczbę liczb parzystych w tablicy źródłowej:

var evenNumQuery = 
    from num in numbers
    where (num % 2) == 0
    select num;

int evenNumCount = evenNumQuery.Count();

Aby wymusić natychmiastowe wykonanie dowolnego zapytania i buforowanie jego wyników, możesz wywołać metody ToList``1 lub ToArray``1.

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

// or like this: 
// numQuery3 is still an int[] 

var numQuery3 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToArray();

Możesz również wymusić wykonanie przez umieszczenie pętli foreach tuż za wyrażeniem zapytania.Jednakże wywołując metodę ToList lub ToArray, również buforujesz wszystkie dane w jednym obiekcie kolekcji.

Zobacz też

Zadania

Wskazówki: pisanie zapytań w C# (LINQ)

Przykłady interfejsów LINQ

Informacje

foreach, in (odwołanie w C#)

Koncepcje

O/R Designer Overview

Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#)

Inne zasoby

Wprowadzenie do korzystania z LINQ w C#

Słowa kluczowe zapytania (odwołanie w C#)

Film o programie LINQ i wykonywaniu odroczonym