|
Программирование >> Программирование с использованием ajax
Если запрос может вернуть множество элементов, то этот тип должен вести себя как коллекция объектов из источника данных запроса (технически - это не коллекция; она лишь выглядит так). Если вы хотите знать подробности, то скажем, что результат запроса будет типом, реализующим интерфейс lEnumerableo. В данном конкретном случае компилятор создает экземпляр System,Linq, OrderSequence<stringf string>- специального типа данных LINQj который представляет упорядоченный список строк (потому что источник данных- коллекция строк). Кстати, имя queryResult произвольно - вы можете назвать результат так, как вам нравится. Это может быть namesBeginningWithS или что-нибудь другое, что имеет смысл внутри программы. Спецификация источника данных: конструкция from Следующая часть запроса LINQ - конструкция from, которая специфицирует источник запрашиваемых данных: from п in names Источником данных в рассматриваемом случае является names - массив строк, объявленный ранее. Переменная п - просто заместитель индивидуальных элементов в источнике данных, подобно переменной паше, следующей за оператором foreach. Специфицируя from, вы сообщаете о том, что собираетесь запросить подмножество коллекции, а не выполнять итерацию по всем элементам. Говоря об итерации, мы подразумеваем, что источник данных LINQ должен быть перечислимым - т.е. он должен быть массивом или коллекцией элементов, из которой их можно извлекать по одному. Технически это означает, что источник данных должен поддерживать интерфейс lEnumerableo, что присуще любому массиву или коллекции элементов С#. Источник данных не может быть единственным значением или объектом, таким как отдельная переменная int. И в самом деле, если уже имеется единственный элемент, зачем его запрашивать? Спецификация условия: конструкция where в следующей части запроса LINQ вы специфицируете условие запроса, используя конструкцию where, которая выглядит так: where п.StartWith( S ) В конструкции where может быть специфицировано любое булевское выражение, которое применимо к элементам в источнике данных. На самом деле конструкция where не обязательна, и даже может быть опущена, но почти во всех случаях понадобится специфицировать условие where, чтобы ограничить результат только необходимыми данными. Конструкция where называется ограничивающей операцией в LINQ, потому что она ограничивает результат запроса. Здесь вы специфицируете, что строка name должна начинаться с буквы S, но можно было бы специфицировать что-нибудь другое вместо этого, например, что длина должна быть больше 10 (where п. Length > 10) или имя должно содержать в себе букву Q (where п. Contains ( Q )). Выбор элементов: конструкция select и, наконец, конструкция select специфицирует, какие элементы появятся в результирующем наборе. Выглядит она так: select п Конструкция select необходима, потому что вы должны специфицировать элементы, которые запрос поместит в результирующий набор. Для рассматриваемого набора данных это не очень интересно, поскольку в каждом объекте результирующего набора есть только один элемент - имя. Далее будут показаны некоторые примеры более сложных объектов в результирующем наборе, где полезность конструкции select будет более наглядной, а пока давайте завершим наш первый пример. Последний штрих: использование цикла foreach Теперь вы печатаете результаты запроса. Подобно массиву, использованному в качестве источника данных, результат запроса LINQ вроде этого является перечислимым (enumerable) - в том смысле, что вы можете выполнить итерацию по результату с помощью оператора foreach: Console.WriteLine( Имена, начинающиеся с S: ); foreach (var item in queryResults) { Console.WriteLine (item) ; В этом случае получается совпадением с четырьмя именами - Singh, Small, Smythe и Samba, и именно они будут выведены в цикле foreach. Отложенное выполнение запроса Можете показаться, что цикл foreach не является частью самого LINQ- ведь он просто перебирает полученные результаты. Хотя это и верно, что конструкция foreach не принадлежит только LINQ, тем не менее, это часть кода, которая в действительности выполняет запрос LINQ! Присваивание результата запроса переменной лишь сохраняет план его выполнения; в LINQ сами данные не извлекаются до тех пор, пока не выполнено обращение к результату. Это называется отложенным выполнением запроса, или ленивым выполнением запроса. Выполнение откладывается для любого запроса, производящего последовательности, т.е. список результатов. Теперь вернемся к коду. Поскольку результаты распечатаны, давайте завершим программу: Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine(); Эти строки лишь гарантируют, что результаты консольной программы останутся на экране до тех пор, пока вы не нажмете клавишу, даже если вы запустите ее нажатием <F5> вместо <Ctrl+F5>. Эта конструкция будет применяться и в других примерах LINQ. Использование синтаксиса методов LINQ и лямбда-выражений в LINQ существует много способов решения одной и той же задачи, как это часто бывает в программировании. Как уже отмечалось, предыдущий пример написан с использованием синтаксиса запросов LINQ. В следующем примере вы напишете ту же программу с применением синтаксиса методов LINQ (также известного, как явный синтаксис, но мы будем называть его синтаксисом методов). Расширяющие методы LINQ LINQ реализован в виде серии расширяющих методов коллекций, массивов, результатов запросов и любых других объектов, реализующих интерфейс lEnumerable. Вы можете видеть эти методы в средстве IntelliSense Visual Studio. Например, откройте файл Program. CS только что скомпилированной программы 26-1-FirstLINQquery в Visual С# 2008 и введите новую ссылку на тот же массив names, как показано ниже: string[] names = { Alonso , Zheng , Smith , Jones , Smythe , Small , Ruiz , Hsieh , Jorgenson , Ilyich , Singh , Samba , Fatimah }; names. Как только вы введете точку после names, то сразу увидите в раскрывающемся списке IntelliSense все доступные методы объекта names, как показано на рис. 26.1. SyncRoot Take о TakeWhIleo ToArray о ToDlctlonaryo ToLlstO ToLookupO ToString Union <> n(extenslon) lEnumerable <TSource> lEnumerable <TSource> Where <Т5оигсв> [Filters a sequence of values based on a predicate. Each elements index Is used Puc. 26.1. Работа средства IntelliSense Метод WhereO и большинство прочих доступных методов являются расширяющими методами (что отмечено в документации словом extension, следующим за Whereo). Вы можете увидеть, что они являются расширениями LINQ, если закомментируете директиву using System.Linq в начале файла. Тогда WhereO, UnionO, Takeso и большинство других методов исчезнут из этого списка. Выражение запроса for. . .where. . .select, использованное в предыдущем примере, транслируется компилятором С# в серию вызовов этих методов. При использовании синтаксиса методов LINQ вы вызываете эти методы напрямую. Синтаксис запросов в сравнении с синтаксисом методов Синтаксис запросов является предпочтительным способом программирования запросов в LINQ, поскольку его намного легче читать и проще использовать в большинстве часто применяемых запросов. Однако важно иметь базовое понятие о синтаксисе методов, поскольку некоторые возможности LINQ либо недоступны в синтаксисе запросов, либо просто их легче применять в синтаксисе методов. Как рекомендует онлайновая справочная система Visual С# 2008, используйте синтаксис запросов, когда возможно, и синтаксис методов, когда необходимо. В этой главе применяется в основном синтаксис запросов, но будут показаны ситуации, когда необходим синтаксис методов, и продемонстрировано, как использовать синтаксис методов для решения проблемы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |