Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.16.2Перевод выражений запросов

В языке C# не задается семантика выполнения выражений запросов. Вместо этого выражения запросов переводятся в вызовы методов, которые соответствуют шаблону выражения запроса (§7.16.3). В частности, выражения запросов переводятся в вызовы методов с именами Where, Select, SelectMany, Join, GroupJoin, OrderBy, OrderByDescending, ThenBy, ThenByDescending, GroupBy и Cast. Эти методы должны иметь специальные подписи и типы результатов, как описано в разделе §7.16.3. Эти методы могут быть методами экземпляра запрашиваемого объекта или методами расширения, внешними для объекта, и в них может реализовываться фактическое выполнение запроса.

Перевод из выражения запроса в вызов метода состоит в синтаксическом сопоставлении, которое происходит до проведения каких-либо привязок или разрешения перегрузки. Перевод гарантированно является синтаксически корректным, однако семантическая корректность кода C# не гарантируется. После перевода выражений запросов получившиеся вызовы методов обрабатываются как обычные вызовы методов. При этом также могут обнаруживаться ошибки, например, если методы не существуют, если аргументы имеют неправильные типы или если методы являются универсальными и вывод типов завершается сбоем.

Обработка выражения запроса повторяется с применением следующих переводов до тех пор, пока не удается выполнить дальнейшее сокращение. Переводы приведены в порядке применения: для каждого раздела подразумевается, что переводы в предыдущих разделах были выполнены полностью, и по завершении раздел не будет пересматриваться при обработке такого же выражения запроса.

Присвоение для переменных диапазона не разрешено в выражениях запросов. Однако при реализации C# разрешается не во всех случаях выполнять это ограничение, поскольку иногда это становится невозможным для представленной здесь синтаксической схемы перевода.

При некоторых переводах вставляются переменные диапазона с прозрачными идентификаторами, обозначенными *. Особые свойства прозрачных идентификаторов рассматриваются в разделе §7.16.2.7.

7.16.2.1Предложения select и groupby с продолжениями

Выражение запроса с продолжением

from … into x

переводится в

from x in ( from … ) …

В переводах в следующих разделах предполагается, что в запросах нет продолжений into.

В примере

from c in customers group c by c.Country into g select new { Country = g.Key, CustCount = g.Count() }

переводится в

from g in from c in customers group c by c.Country select new { Country = g.Key, CustCount = g.Count() }

конечный перевод имеет вид

customers. GroupBy(c => c.Country). Select(g => new { Country = g.Key, CustCount = g.Count() })

7.16.2.2Явные типы переменных диапазона

Предложение from, явно указывающее тип переменной диапазона

from T x in e

переводится в

from x in ( e ) . Cast < T > ( )

Предложение join, явно указывающее тип переменной диапазона

join T x in e on k1 equals k2

переводится в

join x in ( e ) . Cast < T > ( ) on k1 equals k2

В переводах в следующих разделах предполагается, что в запросах нет явных типов переменных диапазона.

В примере

from Customer c in customers where c.City == "London" select c

переводится в

from c in customers.Cast<Customer>() where c.City == "London" select c

конечный перевод имеет вид

customers. Cast<Customer>(). Where(c => c.City == "London")

Явные типы переменных диапазона удобно использовать при запросе к коллекциям, в которых реализуется неуниверсальный интерфейс IEnumerable, но не универсальный интерфейс IEnumerable<T>. В примере выше это имело бы место, если бы таблица customers имела тип ArrayList.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]