Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

24. Linq to Objects. Вид запроса. Вызов цепочек расширяющих методов. Языковые конструкции для кодирования запроса. Отложенное и неотложенное выполнение запроса.

LINQ to Objects – название для IEnumerable<T>API для стандартных операций запросов; применительно к различным объектам (списки, карты, массивы); стандартные операции запросов – это статические методы класса System.Linq.Enumerablе. Обеспечивает возможность запросов любых объектов С#, на­ходящихся в памяти, таких как массивы, списки и другие типы коллекций.

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

var query = from employee in employees

where employee.Salary > 100000

orderby employee.LastName, employee.FirstName

select new {LastName = employee.LastName, FirstName = employee .FirstName} ;

Для того чтобы использовать Linq To Object необходимо подключить System.Linq.

Каждое выражение запроса в Linq To Object начинает­ся с конструкции from, объявляющей то, что называется переменной диапазона. Конструкция from очень похожа на оператор foreach в том, что осуществляет итерацию по коллекции employees, и на каждом шаге сохраняет ка­ждый элемент коллекции в переменной (в нашем случае, employee). После конструкции from запрос состоит из последовательности инструкций, где можно использовать различные операции запроса для фильтрации данных, представленных переменной диапа­зона. В нашем примере это конструкции where и orderby. И, наконец, выражение закрывается операцией проекции. Конечный результат построения выражения запроса сосредоточен в том, что на­зывается переменной запроса, в нашем примере — query. Переменная запроса query имеет анонимный тип.

LINQ построен на использовании стандартных операций запросов, которые представляют собой методы, предназначенные для операций с последовательно­стями, подобными коллекциям, которые реализуют интерфейсы IEnumerable и IQueryable. Когда компилятор С# встречает выражение запроса, то преобразует в последовательность или цепочку запросов расширяю­щих методов, реализующих это поведение.

У такого подхода есть два преимущества. Одно состоит в том, что можно выполнять те же действия, что и выражение запроса LINQ, явно вызывая расширяющие методы. Результирующий код не так легко читать, как код с выра­жениями запросов. Однако бывают случаи, когда нужна функциональность расши­ряющих методов, а полное выражение запроса, может быть излишним.

Самое большое преимущество такого подхода связано с расширяемостью LINQ. То есть мы можем определить собственный набор расширяющих методов, а компи­лятор сгенерирует их вызовы при компиляции выражения запроса LINQ.

С# 2008 представил небольшой набор новых ключевых слов для создания вы­ражений запросов LINQ: from, join, where, group, into, let, orderby и select.

Каждый запрос начинается с ключевого слова from. Оно определяет переменную диапазона, т.е. локальную переменную для каждого элемента коллекции. Потом in и указывается коллекция. Можно указывать 2 локальных переменных: from x, y in arr1. Коллекцию должен реализовывать интерфейс IEnumerable <T>.

Используются также конструкции:

Where <условие отбора> - указывается для нее предикат - любое логическое выражение.

Join – для присоединения другой таблицы

Orderby - для сортировки

Select - проектор (который генерирует конечный результат) <выражение для проектора>, оно транслируется в λ-выражение.

Group – группировка.

Let – вводит внутреннюю переменную, для того, чтобы избавится от повторений выражений в LINQ запросе.

Отложенные и не отложенные запросы.

Важно помнить, что хотя многие из стандартных операций запросов прототипированы на возврат IEnumerable<T>, и мы воспринимаем IEnumerable<T> как последовательность, на самом деле операции не возвращают последовательность в момент их вызова. Вместо этого операции возвращают объект, который при перечислении порождает (yield) очередной элемент последовательности. Во время перечисления возвращенного объекта запрос выполняется, и порожденный элемент помещается в выходную последовательность. Таким образом, выполнение запроса отложено. Отложенную операцию легко вычислить, поскольку она должна возвращать тип IEnumerable<T> или IOrderedEnumerable<T>(примеры отложенных операций: where и select).

Не отложенных операции (nondeferred) - их легко отличить по типу возврата, отличающемуся от IEnumerable<T> или IOrderedEnumerable<T>. Примеры не отложенных операций: ToArray<T> - создает массив типа Т из входной последовательности типа Т; ToList<T> - создает лист типа Т из входной последовательности типа Т. Запросы на группировку или сортировку всегда неотложенные. При их выполнении создается итератор, выполняется проход и дополнительные действия.

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