Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Сортировка результатов запроса с помощью оператора orderby



 

Результаты запроса можно очень легко отсортировать, используя такое средство LINQ, как оператор orderby.

Оператор orderby можно использовать для сортировки результатов запроса по одному или нескольким критериям. Ниже приведена общая форма оператора orderby для сортировки результатов запроса по одному критерию:

orderby элемент порядок

где элемент обозначает конкретный элемент, по которому проводится сортировка.

Это может быть весь элемент, хранящийся в источнике данных, или только часть одного поля в данном элементе. А порядок обозначает порядок сортировки по нарастающей или убывающей с обязательным добавлением ключевого слова ascending или descending соответственно. По умолчанию сортировка проводится по нарастающей, и поэтому ключевое слово ascending, как правило, не указывается.

Ниже приведен пример программы, в которой оператор orderby используется для извлечения значений из массива типа int по убывающей.

// Продемонстрировать применение оператора orderby.

using System;

using System.Linq;

class OrderbyDemo {

static void Main() {

int[] nums = { 10, -19, 4, 7, 2, -5, 0 };

//Сформировать запрос на получение значений в //отсортированном порядке,

var posNums = from n in nums

orderby n descending

select n;

Console.Write(" Значения по убывающей: " );

// Выполнить запрос и вывести его результаты.

foreach(int i in posNums) Console.Write(i + " " );

Console.WriteLine();

}

}

 

Для сортировки по нескольким критериям служит приведенная ниже форма оператора orderby.

orderby элемент_А направление, элемент_В направление, элемент_С направление, ...

В данной форме элемент_А обозначает конкретный элемент, по которому проводится основная сортировка; элемент_В — элемент, по которому производится сортировка каждой группы эквивалентных элементов; элемент_С — элемент, по которому производится сортировка всех этих групп, и т.д. Таким образом, каждый последующий элемент обозначает дополнительный критерий сортировки. Во всех этих критериях указывать направление сортировки необязательно, но по умолчанию сортировка проводится по нарастающей.

 

Операторы group, into, let и join

Оператор group позволяет группировать полученные результаты по ключам. Используя последовательность сгруппированных результатов, можно без особого труда получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора group доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор group является одним из двух операторов, которыми может оканчиваться запрос. (Вторым оператором, завершающим запрос, является select.) Ниже приведена общая форма оператора group.

group переменная_диапазона by ключ

Этот оператор возвращает данные, сгруппированные в последовательности, причем каждую последовательность обозначает общий ключ.

Результатом выполнения оператора group является последовательность, состоящая из элементов типа IGrouping< TKey, TElement>, т.е. обобщенного интерфейса, объявляемого в пространстве имен System.Linq. В этом интерфейсе определена коллекция объектов с общим ключом. Типом переменной запроса, возвращающего группу, является IEnumerable< IGrouping< TKey, TElemen> >. В интерфейсе IGrouping определено также доступное только для чтения свойство Key, возвращающее ключ, связанный с каждой коллекцией.

При использовании в запросе оператора select или group иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена общая форма оператора into:

into имя тело_запроса

где имя обозначает конкретное имя переменной диапазона, используемой для циклического обращения к временному результату в продолжении запроса, на которое указывает тело_запроса. Когда оператор into используется вместе с оператором select или group, то его называют продолжением запроса, поскольку он продолжает запрос. По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего.

Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Допустим, что требуется создать переменную перечислимого типа, которую можно будет затем запросить, или же сохранить некоторое значение, чтобы в дальнейшем использовать его в операторе where. Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора let. Ниже приведена общая форма оператора let:

let имя = выражение

где имя обозначает идентификатор, получающий значение, которое дает выражение. Тип имени выводится из типа выражения.

Когда приходится иметь дело с базами данных, то зачастую требуется формировать последовательность, увязывающую данные из разных источников. И это нетрудно сделать с помощью такого средства LINQ, как оператор join.

Ниже приведена общая форма оператора join.

from переменная_диапазона_А in источник_данных_А

join переменная_диапазона_В in источник_данных_В

on переменная_диапазона_А.свойство equals переменная_диапазона_В.свойство

Применяя оператор join, следует иметь в виду, что каждый источник должен содержать общие данные, которые можно сравнивать. Поэтому в приведенной выше форме этого оператора источник_данных_А и источник_данных_В должны иметь нечто общее, что подлежит сравнению. Сравниваемые элементы данных указываются в части on данного оператора. Поэтому если переменная_диапазона_А.свойство и переменная_диапазона_B.свойство равны, то эти элементы данных " увязываются" успешно. По существу, оператор join выполняет роль своеобразного фильтра, отбирая только те элементы данных, которые имеют общее значение.

 

Методы запроса

 

Другой способ формирования запросов состоит в использовании методов запроса, которые могут вызываться для любого перечислимого объекта.

Методы запроса определяются в классе System.Linq.Enumerable и реализуются в виде методов расширения функций обобщенной формы интерфейса IEnumerable< T>.

В классе Enumerable предоставляется немало методов запроса, но основными считаются те методы, которые соответствуют описанным ранее операторам запроса. Эти методы перечислены в табл. 6 вместе с соответствующими операторами запроса. Следует, однако, иметь в виду, что эти методы имеют также перегружаемые формы, а здесь они представлены лишь в самой простой своей форме. Но именно эта их форма используется чаще всего.

Таблица 6.

Основные методы запроса

Оператор запроса Эквивалентный метод запроса
select Select(selector)
where Where(predicate)
orderby OrderBy(keySelector) или OrderByDescending(KeySelector)
join Join(inner, outerKeySelector, innerKeySelector, result Selector)
group GroupBy(keySelector)

 

Формирование запроса с помощью методов запроса

 

Переделаем пример простого запроса, представленный в начале главы, с использованием методов запроса Select() и Where():

 

using System;

using System.Linq;

class SimpQuery {

static void Main() {

int[] nums = { 1, -2, 3, 0, M, 5 };

// Использовать методы Where() и Select() для

// формирования простого запроса.

var posNums = nums.Where(n => n > 0).Select(r => r);

Console.Write(" Положительные значения из массива nums: " );

// Выполнить запрос и вывести его результаты.

foreach(int i in posNums) Console.Write(i + " " );

Console.WriteLine ();

}

}


Заключение

 

C# является основным языком разработки программ на платформе.NET корпорации Microsoft. В нем удачно сочетаются испытанные средства программирования с самыми последними новшествами и предоставляется возможность для эффективного и очень практичного написания программ, предназначенных для вычислительной среды современных предприятий. Это, без сомнения, один из самых важных языков программирования XXI века.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Шилдт Г. Полное руководство C#4.0. / Г. Шилдт. – М.: ООО «И.Д. Вильямс», 2011. – 1056 с.

2. Троэлсен Э. Язык программирования С# 2010 и платформа.NET 4.0 / Э. Троэлсен. – М.: ООО «И.Д. Вильямс», 2011. – 1392 с.

3. Kumar S.N. LINQ quickly / S.N. Kumar. – Packt Publishing, 2007. – 250 c.

4. Страуструп Б. Дизайн и эволюция C++ / Б. Страуструп. – СПб: Питер, 2006. – 445 с.

5. Clark D. Beginning C# Object-Oriented Programming / D. Clark – Apress, 2011. – 371 c.

6. Либерти Дж. Программирование на C# / Дж. Либерти. – М.: Символ-плюс, 2003. – 690 c.

7. Петцольд Ч. Программирование в тональности С# / Ч. Петцольд. – М.: ИТД «Русская редакция», 2004. – 503 с.

8. Рихтер Дж. Программирование на платформе Microsoft.NET Framework / Дж. Рихтер. – М.: ИТД «Русская редакция», 2003. – 512 с.

9. Павловская Т.А. C#. Программирование на языке высокого уровня / Т.А. Павловская. – СПб: Питер, 2007. – 432 с.

10. Richter J. CLR via C# 3rd Edition / J. Richter – Ms Press – 896 с.

11. Watson K. Beginning Visual C# 2010 / K. Watson, C. Nagel, J.H. Pedersen – wrox – 1080 c.


ОГЛАВЛЕНИЕ

1. Введение в ООП...................................................................... 3

1.1. Этапы развития технологий программирования........... 3

1.2. Введение в ООП.............................................................. 11


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 581; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.026 с.)
Главная | Случайная страница | Обратная связь