Udostępnij za pośrednictwem


Podstawy wyrażenie kwerendy (Podręcznik programowania C#)

Co to jest kwerenda, i czego?

A kwerendy jest zestawem instrukcji w tym artykule opisano, jakie dane do pobrania ze źródłem danych określonym (lub źródeł) i jakie kształtu i organizacji powinien mieć zwracanych danych.Kwerenda jest różne od wyników, które produkuje.

Ogólnie danych źródłowych jest logicznie zorganizowany jako sekwencja elementów tego samego rodzaju.Tabela bazy danych SQL zawiera sekwencji wierszy.Podobnie ADO.NETDataTable zawiera ciąg DataRow obiektów. W pliku XML jest "sekwencja" elementów XML (chociaż są one zorganizowane hierarchicznie w strukturze drzewa).Kolekcja w pamięci zawiera sekwencję obiektów.

Z punktu widzenia aplikacji określonego typu i struktury oryginalnych danych źródłowych nie jest ważna.Aplikacja zawsze zobaczy danych źródłowych, jak IEnumerable<T> lub IQueryable<T> kolekcji.W LINQ to XML, źródło danych jest widoczne jako IEnumerable<XElement>.In LINQ to DataSet, it is an IEnumerable<DataRow>.W LINQ to SQL, jest IEnumerable lub IQueryable niezależnie od niestandardowe obiekty zdefiniowane do reprezentacji danych w tabeli SQL.

Biorąc pod uwagę tę sekwencję źródła, kwerendy mogą wykonaj jedną z trzech rzeczy:

  • Pobrania podzbioru elementów do utworzenia nowej sekwencji bez modyfikowania poszczególnych elementów.Kwerenda może sortowanie i grupowanie zwracane sekwencji na różne sposoby, jak pokazano w poniższym przykładzie (zakładać scores jest int[]):

    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    
  • Pobrać sekwencja elementów, jak w poprzednim przykładzie, ale ich do nowego typu obiektu transform.Na przykład kwerenda może pobierać tylko nazwiska z niektórych rekordów klientów w źródle danych.Lub go może pobierać całego rekordu, a następnie użyć jej do skonstruowania innego typu obiektu w pamięci lub nawet dane XML przed wygenerowaniem sekwencji wyniku końcowego.W poniższym przykładzie pokazano transformacji z int do string.Uwaga nowego typu highScoresQuery.

    IEnumerable<string> highScoresQuery2 =
        from score in scores
        where score > 80
        orderby score descending
        select String.Format("The score is {0}", score);
    
  • Pobrać wartość singleton o źródle danych, takich jak:

    • Liczba elementów, które spełniają pewne warunki.

    • Element, który ma najwyższy lub co najmniej wartość.

    • Pierwszy element, który pasuje do warunku lub sumę określonych wartości w określonym zestawie elementów.Na przykład, poniższa kwerenda zwraca liczbę ocen większa niż 80 z scores integer tablicy:

    int highScoreCount =
        (from score in scores
         where score > 80
         select score)
         .Count();
    

    W poprzednim przykładzie należy zwrócić uwagę użycie nawiasy wokół wyrażenia kwerendy przed wywołaniem Count metody.Można to również wyrazić przy użyciu nowej zmiennej do przechowywania konkretnego wyniku.Ta technika jest bardziej czytelny, ponieważ zmienna, która przechować kwerendę zachowuje oddzielne z kwerendy, która przechowuje wynik.

    IEnumerable<int> highScoresQuery3 =
        from score in scores
        where score > 80
        select score;
    
    int scoreCount = highScoresQuery3.Count();
    

W poprzednim przykładzie, kwerenda jest wykonywana w wywołaniu Count, ponieważ Count musi iteracyjne przeglądanie wyników w celu określenia liczby elementów, zwróconych przez highScoresQuery.

Co to jest wyrażenie kwerendy?

A wyrażenie kwerendy jest kwerenda, wyrażone w składni kwerendy.Wyrażenie kwerendy jest konstrukcje językowe biletu.To jest podobnie jak inne wyrażenia i mogą być używane w dowolnym kontekście, w którym jest prawidłowe wyrażenie języka C#.Wyrażenie kwerendy składa się z zestawu klauzul napisane w deklaracyjne składnię SQL lub XQuery.Klauzula każdego z kolei zawiera jeden lub więcej wyrażeń języka C#, a te wyrażenia mogą same być w wyrażeniu kwerendy lub zawierać wyrażenie kwerendy.

Wyrażenie kwerendy musi zaczynać się z klauzuli i musi kończyć się rozszerzeniem Zaznacz lub grupy klauzuli.Między pierwszym from klauzuli i ostatniego select lub group klauzuli, może zawierać jedną lub więcej z tych klauzul opcjonalnych: gdzie, orderby, sprzężenia, Niech i nawet dodatkowe z klauzul.Można również użyć do słowo kluczowe, aby umożliwić wynik join lub group klauzuli, który będzie służył jako źródło dla klauzule dodatkowe kwerendy, w tym samym wyrażeniu kwerendy.

Bb384065.collapse_all(pl-pl,VS.110).gifZmienna kwerendy

W LINQ, zmienna kwerendy jest dowolnej zmiennej, która przechowuje kwerendy zamiast wyniki kwerendy. W szczególności, zmienna kwerendy jest zawsze agregującym typu, który da sekwencja elementów, gdy jest podstawy nad w foreach instrukcji lub bezpośrednie wywołanie jego IEnumerator.MoveNext metody.

Poniższy przykład kodu pokazuje wyrażeń prostych kwerend z jednego źródła danych, jednej klauzuli filtrowania, jednej klauzuli zamawiania i nie transformacji z elementów źródłowych.select Klauzuli kończy się w kwerendzie.

static void Main()
{
    // Data source.
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable
        from score in scores //required
        where score > 80 // optional
        orderby score descending // optional
        select score; //must end with select or group

    // Execute the query to produce the results
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 93 90 82 82      

W poprzednim przykładzie scoreQuery jest zmienna kwerendy który jest czasem określana jako nieco kwerendy.Zmienna kwerendy są przechowywane żadne dane rzeczywiste wynik jest produkowany w foreach pętli.I po foreach jest wykonywana instrukcja, wyniki kwerendy nie są zwracane przez zmienną kwerendy scoreQuery.Raczej, są zwracane przez zmienną iteracji testScore.scoreQuery Zmienną można podstawy w drugiej foreach pętli.Te same wyniki powoduje wygenerowanie tak długo, jak go ani źródła danych nie została zmodyfikowana.

Zmienna kwerendy może przechowywać kwerendy, która jest wyrażana w składni kwerendy lub składnię metody lub kombinacji obu.W poniższych przykładach zarówno queryMajorCities i queryMajorCities2 są zmienne kwerendy:

//Query syntax
IEnumerable<City> queryMajorCities =
    from city in cities
    where city.Population > 100000
    select city;


// Method-based syntax
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);

Z drugiej strony, następujące dwa przykłady zawierają zmiennych, które nie są zmienne kwerendy, nawet za pośrednictwem każdego jest inicjowana za pomocą kwerendy.Nie są one zmiennych kwerendy, ponieważ zapisują wyniki:

int highestScore =
    (from score in scores
     select score)
    .Max();

// or split the expression
IEnumerable<int> scoreQuery =
    from score in scores
    select score;

int highScore = scoreQuery.Max();

List<City> largeCitiesList =
    (from country in countries
     from city in country.Cities
     where city.Population > 10000
     select city)
       .ToList();

// or split the expression
IEnumerable<City> largeCitiesQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

List<City> largeCitiesList2 = largeCitiesQuery.ToList();

[!UWAGA]

W LINQ dokumentacji, zmienne, które przechowują kwerendy w programie word "kwerenda" jako część ich nazwy.W nazwach zmiennych, które przechowują rzeczywisty wynik nie mają "kwerenda".

Aby uzyskać więcej informacji o różnych sposobach wyraźnej kwerend, zobacz Składnia zapytania i metody w technologii LINQ (C#).

Bb384065.collapse_all(pl-pl,VS.110).gifBezpośrednie i pośrednie, wpisując kwerendę zmiennych

Ta dokumentacja zawiera zazwyczaj wyraźnej typu zmienna do kwerendy w celu pokazania typu relacji między zmienna kwerendy i Zaznacz klauzuli.Jednak można również użyć var. słowo kluczowe, aby nakazać kompilatorowi rozpoznać typ zmiennej kwerendy (lub innej zmiennej lokalnej) w czasie kompilacji.Na przykład przykładzie kwerendy, który został wcześniej przedstawione w tym temacie może być wyrażona za pomocą niejawna, wpisując:

// Use of var is optional here and in all queries.
// queryCities is an IEnumerable<City> just as 
// when it is explicitly typed.
var queryCities =
    from city in cities
    where city.Population > 100000
    select city;

Aby uzyskać więcej informacji, zobacz Wpisane niejawnie zmiennych lokalnych (C# Programming Guide) i Typ relacji w operacjach kwerendy LINQ (C#).

Bb384065.collapse_all(pl-pl,VS.110).gifUruchamianie w wyrażeniu kwerendy

Wyrażenie kwerendy musi zaczynać się from klauzuli.Określa źródło danych wraz ze zmiennej zakres.Zmienna zakres reprezentuje każdy element w sekwencji źródła przecina sekwencji źródła.Zmienna zakres ma jednoznacznie określony w zależności od typu elementów w źródle danych.W poniższym przykładzie ponieważ countries jest tablicą Country obiektów, zmienna zakres również zostanie wpisany jako Country.Ponieważ zmienna zakres ma jednoznacznie określony, umożliwia dostęp wszelkie dostępne elementy członkowskie typu operatora w postaci kropki.

IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km
    select country;

Zmienna zakresu jest w zasięgu, aż kwerenda jest zakończony średnikiem lub z kontynuacji klauzuli.

Wyrażenie kwerendy może zawierać wiele from klauzul.Użyj dodatkowych from klauzul podczas każdego elementu w sekwencji źródła jest sama kolekcja lub zawiera kolekcję.Na przykład załóżmy, że kolekcja Country obiektów, z których każdy zawiera zbiór City obiektów o nazwie Cities.Kwerendę City obiektów w każdej Country, użyj dwóch from klauzule, jak pokazano poniżej:

IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

Aby uzyskać więcej informacji, zobacz z klauzuli (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifKończące się w wyrażeniu kwerendy

Wyrażenie kwerendy musi kończyć się rozszerzeniem albo select klauzuli lub group klauzuli.

Bb384065.collapse_all(pl-pl,VS.110).gifGrupa klauzuli

Użyj group klauzuli produkować sekwencji grup zorganizowane według klucza, który określisz.Klucz musi być dowolnego typu danych.Na przykład, poniższa kwerenda tworzy sekwencji grup zawiera jedną lub więcej Country obiektów i której klucz jest char wartości.

var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

Aby uzyskać więcej informacji na temat grupowania, zobacz Klauzula grupy (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifWybierz klauzuli

Użyj select klauzuli do produkcji wszystkich innych typów sekwencji.Prosty select klauzuli tylko produkuje sekwencji tego samego typu obiekty jako obiekty, które są zawarte w źródle danych.W tym przykładzie źródło danych zawiera Country obiektów.orderby Klauzuli tylko Sortuje elementy w nowe zamówienia i select klauzuli wytwarza sekwencja kolejnos'ci Country obiektów.

IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

select Klauzula może służyć do przekształcenia danych źródłowych w sekwencji nowych typów.Transformacja ta nosi również rzut.W poniższym przykładzie select klauzuli projektów sekwencji typy anonimowe, który zawiera tylko podzbiór pól w oryginalnym elemencie.Uwaga zainicjowanej nowe obiekty za pomocą obiektu inicjatora.

// Here var is required because the query
// produces an anonymous type.
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

Aby uzyskać więcej informacji o wszystkich aspektach, select klauzula może służyć do przekształcania danych źródłowych, zobacz Wybierz klauzuli (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifKontynuacji z "do"

Można użyć into słowa kluczowego w select lub group klauzuli, aby utworzyć tymczasowy identyfikator, który przechowuje kwerendy.W tym muszą wykonywać operacje dodatkowe kwerendy na kwerendę po grupowaniu lub wybierz operację.W poniższym przykładzie countries są pogrupowane według populacji w zakresach 10 milionów.Po tych grup są utworzone, dodatkowe klauzule filtr out niektóre grupy, a następnie do sortowania kolejności grup w porządku rosnącym.Do przeprowadzenia tych dodatkowych operacji, kontynuacji reprezentowane przez countryGroup jest wymagane.

// percentileQuery is an IEnumerable<IGrouping<int, Country>>
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10000000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country>
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

Aby uzyskać więcej informacji, zobacz w (C# odwołanie).

Bb384065.collapse_all(pl-pl,VS.110).gifFiltrowanie, porządkowaniem i łączenie

Między początkową from klauzuli i zakończenie select lub group klauzuli, inne klauzule (where, join, orderby, from, let) są opcjonalne.Dowolne klauzule opcjonalne mogą być używane zero razy lub wiele razy w treści kwerendy.

Bb384065.collapse_all(pl-pl,VS.110).gifgdy klauzula

Użyj where klauzuli do odfiltrowywania elementy w danych źródłowych na podstawie jednego lub wielu wyrażeń predykatu.where Klauzuli w poniższym przykładzie ma dwa predykatów.

IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

Aby uzyskać więcej informacji, zobacz gdy klauzula (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifKlauzula OrderBy

Użyj orderby klauzuli do sortowania wyników rosnąco lub malejąco.Można również określić kolejność sortowania wtórnego.W następującym przykładzie wykonywana sortowania podstawowego na country obiektów za pomocą Area właściwości.Następnie wykonuje drugie sortowanie za pomocą Population właściwości.

IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area, country.Population descending
    select country;

ascending Słowo kluczowe jest opcjonalny; Jeżeli zamówienie nie jest określony, jest domyślną kolejnością sortowania.Aby uzyskać więcej informacji, zobacz Klauzula OrderBy (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifKlauzula Join

Użyj join klauzuli skojarzyć i/lub łączenie elementów ze źródła danych w jednym z elementów z innego źródła danych na podstawie równości porównanie określonych kluczach w każdym elemencie.W LINQ, sprzężenia operacje są wykonywane na sekwencji obiekty, których elementy są różnych typów.Dołączył dwóch sekwencji musi używać select lub group instrukcji, aby określić, który element do przechowywania sekwencji danych wyjściowych.Typ anonimowy umożliwia także połączyć z każdego zestawu elementów skojarzonych właściwości w nowy typ sekwencji danych wyjściowych.Poniższy przykład kojarzy prod obiektów, których Category właściwość odpowiada jednej z kategorii w categories tablicy ciągów.Produkty których Category nie pasuje do dowolnego ciągu w categories są odfiltrowywane.select Instrukcji projekty nowego typu, którego właściwości są pobierane z obu cat i prod.

var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

Sprzężenie grupy można również wykonać, przechowując wyniki join operacji w zmiennej tymczasowej za pomocą do słowa kluczowego.Aby uzyskać więcej informacji, zobacz Klauzula sprzężenia (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifNiech klauzuli

Użyj let klauzuli do przechowywania wyników wyrażenia, takie jak wywołanie metody w zmiennej nowego zakresu.W poniższym przykładzie zmienna zakres firstName przechowuje pierwszy element tablicy ciągów, które są zwracane przez Split.

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(new char[] { ' ' })[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

Aby uzyskać więcej informacji, zobacz Niech klauzuli (C# odniesienia).

Bb384065.collapse_all(pl-pl,VS.110).gifPodkwerendy w wyrażeniu kwerendy

Sama klauzula kwerendy może zawierać wyrażenie kwerendy jest czasem określana jako podkwerendy.Każdy podkwerendy rozpoczyna się od swoich własnych from klauzuli, która nie musi koniecznie wskaż to samo źródło danych w pierwszym from klauzuli.Na przykład poniższa kwerenda pokazuje w wyrażeniu kwerendy, która jest używana w instrukcji select, aby odebrać wyniki operacji grupowania.

var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

Aby uzyskać więcej informacji, zobacz Jak: wykonywanie podkwerendy w operacji grupowania (Podręcznik programowania C#).

Zobacz też

Koncepcje

Podręcznik programowania C#

Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)

Omówienie operatory kwerendy standardowe

Inne zasoby

LINQ (zintegrowane języka kwerend)

Słowa kluczowe kwerendy (C# odniesienia)