Relacje typu w operacjach kwerend LINQ (C#)Type Relationships in LINQ Query Operations (C#)

Aby efektywnie pisać zapytania, należy zrozumieć, jak typy zmiennych w kompletnej operacji zapytania wszystkie odnoszą się do siebie.To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. Jeśli rozumiesz te relacje, łatwiej będzie comprehend LINQLINQ przykłady i przykłady kodu w dokumentacji.If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. Ponadto dowiesz się, co się dzieje w tle, gdy zmienne są wpisywane niejawnie varprzy użyciu.Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

LINQLINQoperacje zapytań są jednoznacznie wpisywane w źródle danych, w samej kwerendzie i w wykonaniu zapytania.query operations are strongly typed in the data source, in the query itself, and in the query execution. Typ zmiennych w zapytaniu musi być zgodny z typem elementów w źródle danych i typem zmiennej iteracji w foreach instrukcji.The type of the variables in the query must be compatible with the type of the elements in the data source and with the type of the iteration variable in the foreach statement. Takie silne wpisywanie gwarantuje, że błędy typu są przechwytywane w czasie kompilacji, gdy można je poprawić przed ich wystąpieniem przez użytkowników.This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

Aby przedstawić te relacje typu, większość przykładów, które są zgodne z użyciem jawnego wpisywania dla wszystkich zmiennych.In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. W ostatnim przykładzie pokazano, jak te same zasady mają zastosowanie nawet w przypadku użycia niejawnego wpisywania przy użyciu funkcji var.The last example shows how the same principles apply even when you use implicit typing by using var.

Zapytania, które nie przekształcają danych źródłowychQueries that do not Transform the Source Data

Na poniższej ilustracji przedstawiono LINQLINQ operację zapytania do obiektów, która nie wykonuje transformacji danych.The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. Źródło zawiera sekwencję ciągów, a dane wyjściowe zapytania są również sekwencją ciągów.The source contains a sequence of strings and the query output is also a sequence of strings.

Diagram przedstawiający relację typów danych w zapytaniu LINQ.

  1. Argument typu źródła danych określa typ zmiennej zakresu.The type argument of the data source determines the type of the range variable.

  2. Typ wybranego obiektu określa typ zmiennej zapytania.The type of the object that is selected determines the type of the query variable. Oto name ciąg.Here name is a string. W związku z tym zmienna zapytania jest IEnumerable<string>.Therefore, the query variable is an IEnumerable<string>.

  3. Zmienna zapytania jest powtarzana w foreach instrukcji.The query variable is iterated over in the foreach statement. Ponieważ zmienna zapytania jest sekwencją ciągów, Zmienna iteracji jest również ciągiem.Because the query variable is a sequence of strings, the iteration variable is also a string.

Zapytania, które przekształcają dane źródłoweQueries that Transform the Source Data

Na poniższej ilustracji przedstawiono LINQ do SQLLINQ to SQL operację zapytania, która wykonuje prostą transformację danych.The following illustration shows a LINQ do SQLLINQ to SQL query operation that performs a simple transformation on the data. Zapytanie pobiera sekwencję Customer obiektów jako dane wejściowe i wybiera Name tylko właściwość w wyniku.The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Ponieważ Name jest ciągiem, zapytanie tworzy sekwencję ciągów jako dane wyjściowe.Because Name is a string, the query produces a sequence of strings as output.

Diagram przedstawiający zapytanie, które przekształca typ danych.

  1. Argument typu źródła danych określa typ zmiennej zakresu.The type argument of the data source determines the type of the range variable.

  2. Instrukcja zwraca właściwość zamiast kompletnego Customerobiektu. select NameThe select statement returns the Name property instead of the complete Customer object. Ponieważ Name jest ciągiem, custNameQuery argument typu ma wartość string, a nie Customer.Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. Ponieważ custNameQuery jest sekwencją ciągów foreach , stringZmienna iteracji pętli musi być również.Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

Na poniższej ilustracji przedstawiono nieco bardziej skomplikowaną transformację.The following illustration shows a slightly more complex transformation. Instrukcja zwraca typ anonimowy, który przechwytuje tylko dwa elementy członkowskie oryginalnego Customer obiektu. selectThe select statement returns an anonymous type that captures just two members of the original Customer object.

Diagram przedstawiający bardziej złożone zapytania, które przekształcają typ danych.

  1. Argument typu źródła danych jest zawsze typem zmiennej zakresu w zapytaniu.The type argument of the data source is always the type of the range variable in the query.

  2. Ponieważ instrukcja generuje typ anonimowy, zmienna zapytania musi być wpisana niejawnie przy użyciu var. selectBecause the select statement produces an anonymous type, the query variable must be implicitly typed by using var.

  3. Ponieważ typ zmiennej zapytania jest niejawny, Zmienna iteracji w foreach pętli musi być również niejawna.Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

Zezwalanie na informacje o typie wnioskowania kompilatoraLetting the compiler infer type information

Chociaż należy zrozumieć relacje typu w operacji zapytania, masz możliwość zezwalania kompilatorowi na wykonywanie wszystkich zadań.Although you should understand the type relationships in a query operation, you have the option to let the compiler do all the work for you. Var słowa kluczowego może być używana dla każdej zmiennej lokalnej w operacji zapytania.The keyword var can be used for any local variable in a query operation. Poniższa ilustracja jest podobna do przykładu numer 2, który został omówiony wcześniej.The following illustration is similar to example number 2 that was discussed earlier. Jednak kompilator dostarcza mocny typ dla każdej zmiennej w operacji zapytania.However, the compiler supplies the strong type for each variable in the query operation.

Diagram przedstawiający przepływ typu z niejawnym wpisywaniem.

Aby uzyskać więcej informacji varna temat, zobacz niejawnie wpisane zmienne lokalne.For more information about var, see Implicitly Typed Local Variables.