Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Синтаксис метода

Некоторые операции запросов должны быть выражены в виде вызова метода.Чаще всего используются методы, возвращающие одноэлементные числовые значения, например Sum,Max,Min,Averageи т.д.Эти методы всегда должны быть вызваны последними в запросе, поскольку они представляют только одно значение и не могут служить источником дополнительных действий запроса.В следующем примере демонстрируется вызов метода в выражении запроса.

C#

List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };

// Query #4.

double average = numbers1.Average();

// Query #5.

IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

Если у метода есть параметры, они представлены в виде лямбда-выражения, как показано в следующем примере.

C#

// Query #6.

IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

В предыдущих запросах только запрос №4 выполнялся немедленно. Причина заключается в том, что он возвращает одиночное значение, а не универсальную коллекцию IEnumerable<T>.Сам метод должен использовать foreach для вычисления значения.

Любой их перечисленных ранее запросов можно написать с использованием неявной типизации с помощью var, как показано в следующем примере.

C#

// var is used for convenience in these queries

var average = numbers1.Average();

var concatenationQuery = numbers1.Concat(numbers2);

var largeNumbersQuery = numbers2.Where(c => c > 15);

Смешанный синтаксис запроса и метода

В этом примере демонстрируется использование синтаксиса метода для результатов предложения запроса.Нужно всего лишь заключить выражение запроса в скобки, а затем применить оператор точки и вызвать метод.В следующем примере запрос #7 возвращает количество чисел, значение которых лежит в диапазоне от 3 до 7.Однако в общем случае лучше использовать вторую переменную для хранения результатов вызова метода.Таким образом, будет меньше вероятность перепутать запрос с результатами запроса.

C#

// Query #7.

// Using a query expression with method syntax

int numCount1 =

(from num in numbers1

where num < 3 || num > 7

select num).Count();

// Better: Create a new variable to store

// the method call result

IEnumerable<int> numbersQuery =

from num in numbers1

where num < 3 || num > 7

select num;

int numCount2 = numbersQuery.Count();

Запрос №7 возвращает одиночное значение, а не коллекцию, поэтому он выполняется мгновенно.

Предыдущий запрос можно написать с использованием неявной типизации с помощью var, как показано в следующем примере:

var numCount = (from num in numbers...

Можно использовать синтаксис метода следующим образом.

var numCount = numbers.Where(n => n < 3 || n > 7).Count();

Можно использовать явную типизацию следующим образом.

int numCount = numbers.Where(n => n < 3 || n > 7).Count();

Запрос в деталях (Руководство по программированию в c#) Что такое запрос и для чего он нужен

Запрос — это набор инструкций, которые описывают, какие данные необходимо извлечь из указанного источника (или источников) данных, а также описывают форму и организацию извлекаемых данных. Запрос отличается от полученного с его помощью результата.

Обычно исходные данные логически организованы как последовательность элементов одного вида. База данных SQL содержит последовательность строк. Аналогично, ADO.NET DataTable содержит последовательность объектов DataRow. В файле XML содержится "последовательность" элементов XML (они организованы иерархически в древовидную структуру). Коллекция в памяти содержит последовательность объектов.

С точки зрения приложения определенные тип и структура оригинальных исходных данных не важны. Исходные данные всегда представляются приложению как коллекция IEnumerable<T> или IQueryable<T>. В LINQ to XML исходные данные становятся видимыми как IEnumerable<XElement>. В LINQ to DataSet — какIEnumerable<DataRow>. В LINQ to SQL — какIEnumerableилиIQueryableлюбого из пользовательских объектов, которые были определены для представления данных в таблице SQL.

При такой исходной последовательности запрос может выполнять одно из трех возможных действий.

  • Извлечение подмножества элементов для получения новой последовательности без изменения отдельных элементов. Затем запрос может отсортировать или сгруппировать возвращаемую последовательность различными способами, как показано в следующем примере (предположим, что scoresявляется int[]):

IEnumerable<int> highScoresQuery =

from score in scores

where score > 80

orderby score descending

select score;

  • Извлечение последовательности элементов, как и в предыдущем примере, но с преобразованием элементов в новый вид объекта. Например, запрос может извлекать только фамилии из определенных записей клиентов в источнике данных. Запрос также может извлекать полную запись и использовать ее для создания другого типа объекта в памяти или даже данных XML перед созданием заключительной последовательности результатов. В следующем примере показана трансформация int в string. Обратите внимание на новый тип highScoresQuery.

IEnumerable<string> highScoresQuery2 =

from score in scores

where score > 80

orderby score descending

select String.Format("The score is {0}", score);

  • Извлечение одноэлементного значения исходных данных, такого как:

    • Количество элементов, которое соответствует определенному условию.

    • Элемент, обладающий наибольшим или наименьшим значением.

    • Первый элемент, соответствующий условию, или сумма определенных значений в заданном наборе элементов. Например, следующий запрос возвращает количество оценок выше 80 из целочисленного массива scores:

int highScoreCount =

(from score in scores

where score > 80

select score)

.Count();

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

IEnumerable<int> highScoresQuery3 =

from score in scores

where score > 80

select score;

int scoreCount = highScoresQuery3.Count();

В предыдущем примере запрос выполняется в вызове Count, так какCountдолжен выполнить итерацию результатов, чтобы определить количество элементов, возвращенныхhighScoresQuery.