Лекция8

Содержание

Слайд 2

Основы LINQ

LINQ (Language Integrated Query) – технология, представляющая собой набор функций, позволяющих

Основы LINQ LINQ (Language Integrated Query) – технология, представляющая собой набор функций,
писать структурированные безопасные запросы к локальным объектам-коллекциям и удаленным источникам данных.
LINQ – это язык структурированных запросов к любым массивам и коллекциям объектов, управляемых вашей программой.

Слайд 3

Архитектура LINQ

Архитектура LINQ

Слайд 4

SQL-запрос:
select * from Student where Stipend > 500
and Kurs > 3
Конструкция

SQL-запрос: select * from Student where Stipend > 500 and Kurs >
LINQ:
var result =
from St in Student
where St.Stipend > 500 and Kurs > 3
select St;

Запросы LINQ

Слайд 5

Первый оператор: from – это объявление переменной диапазона.
Затем идет ограничивающий оператор: where

Первый оператор: from – это объявление переменной диапазона. Затем идет ограничивающий оператор:
– фильтрация данных.
OrderBy, ThenBy – поле сортировки по одному или нескольким ключам (по возрастанию, убыванию).
Оператор проекции: group или select – значения, полученные в запросе.
join – связывание элементов из последовательностей.

Правила составления запросов LINQ

Слайд 6

Интегрированный запрос:
var contacts = from c in customers
where c.City ==

Интегрированный запрос: var contacts = from c in customers where c.City ==
"Москва"
select new { c.City, c.Phone };
С использованием лямбда-выражений:
var contacts = customers
.Where (c => c.City == "Москва")
.Select (c => new { c.Name, c. Phone } );

Запросы LINQ

Слайд 7

x => x * 5
Лямбда-оператор => читается как «переходит в».
Левая часть лямбда-оператора

x => x * 5 Лямбда-оператор => читается как «переходит в». Левая
определяет параметры ввода, а правая часть содержит выражение.

Лямбда выражения

Слайд 8

Запросы LINQ

Запросы LINQ

Слайд 9

Запросы-выражения поддерживают только ограниченный набор операторов:
Where
Select
SelectMany
OrderBy
ThenBy
OrderByDescending
ThenByDescending
GroupBy
Join
GroupJoin

Интегрированные запросы

Запросы-выражения поддерживают только ограниченный набор операторов: Where Select SelectMany OrderBy ThenBy OrderByDescending

Слайд 10

Можно использовать смешанный синтаксис:
string[] names = { "Петр", "Маша", "Марина", "Олег" };
IEnumerable

Можно использовать смешанный синтаксис: string[] names = { "Петр", "Маша", "Марина", "Олег"
query =   from n in names   where n.Length == names.Max (m => m.Length)   select n;

Интегрированные запросы

Слайд 11

Ключевое слово var – упрощает синтаксис. Например, заменяет явное задание результата запроса

Ключевое слово var – упрощает синтаксис. Например, заменяет явное задание результата запроса
IEnumerable
IEnumerable studentInMoskow =
from st in student
where st.City == "Москва"
select st;
var studentInMoskow =
from st in student
where st.City == "Москва"
select st;

Запросы LINQ

Слайд 12

Оператор запроса (query operator) – метод, преобразующий последовательность.
Обычно операторы запроса принимают

Оператор запроса (query operator) – метод, преобразующий последовательность. Обычно операторы запроса принимают
входящую последовательность и возвращают преобразованную исходящую последовательность.

Операторы запроса

Слайд 13

Извлечь из простого массива все имена, длиной как минимум 6 символов.
string[] names

Извлечь из простого массива все имена, длиной как минимум 6 символов. string[]
= { «Петр», «Николай», «Алексей» };
IEnumerable query =   Enumerable.Where(names, n => n.Length > 5);
foreach (string k in query)   Console.WriteLine (k);

Оператор Where

Слайд 14

IEnumerable query =   Enumerable.Where(names, n => n.Length > 5);
Можно вызывать метод Where

IEnumerable query = Enumerable.Where(names, n => n.Length > 5); Можно вызывать метод
как экземплярный:
IEnumerable query =
names.Where(n => n.Length > 5);

Оператор Where

Слайд 15

Агрегирующие операторы Count, Min, Max, Sum и Average возвращают скалярное значение числового

Агрегирующие операторы Count, Min, Max, Sum и Average возвращают скалярное значение числового
типа.
int[] numbers = { 10, 9, 8, 7, 6 };
int count = numbers.Count(); // 5 int min = numbers.Min(); // 6 int max = numbers.Max(); // 10 double avg = numbers.Average(); // 8

Агрегирующие операторы

Слайд 16

Кванторы в LINQ возвращают логическое значение.
К ним относятся Contains, Any, All, SequenceEquals:
int[]

Кванторы в LINQ возвращают логическое значение. К ним относятся Contains, Any, All,
numbers = { 10, 9, 8, 7, 6 };
bool hasTheNum = numbers.Contains (9); bool hasMoreThanZeroElements = numbers.Any(); bool hasOddNum = numbers.Any (n => n % 2 == 1); bool allOddNums = numbers.All (n => n % 2 == 1);

Кванторы

Слайд 17

Операторы комплектовщики Concat и Union принимают две входящие последовательности одного типа и образуют

Операторы комплектовщики Concat и Union принимают две входящие последовательности одного типа и
новую, присоединяя одну последовательность к другой:
int[] seq1 = { 1, 2, 3 }, seq2 = { 3, 4, 5 };
IEnumerable   concat = seq1.Concat (seq2), // { 1, 2, 3, 3, 4, 5 }   union = seq1.Union (seq2), // { 1, 2, 3, 4, 5 }

Операторы комплектовщики

Слайд 18

int[] seq1 = { 1, 2, 3 }, seq2 = { 3,

int[] seq1 = { 1, 2, 3 }, seq2 = { 3,
4, 5 };
IEnumerable   commonality = seq1.Intersect (seq2), // { 3 }   difference1 = seq1.Except (seq2), // { 1, 2 }   difference2 = seq2.Except (seq1); // { 4, 5 }

Операторы комплектовщики

Слайд 19

Операторы запроса выполняются не в момент их создания, а в момент перечисления

Операторы запроса выполняются не в момент их создания, а в момент перечисления
исходящей последовательности:
var numbers = new List { 3 };
numbers.Add(5);
IEnumerable query = numbers.Select(n => n * 10);
numbers.Add(9); // добавляем элемент
foreach (int k in query)
MessageBox.Show(k.ToString());

Отложенное выполнение

Слайд 20

Фильтрующие операторы
Проецирующие операторы
Объединяющие операторы
Упорядочивающие операторы
Группирующие операторы
Операторы комплектовщики
Элементные операторы
Агрегирующие операторы
Операторы кванторы
Преобразующие-импортирующие операторы
Преобразующие-экспортирующие операторы
Генерирующие

Фильтрующие операторы Проецирующие операторы Объединяющие операторы Упорядочивающие операторы Группирующие операторы Операторы комплектовщики
операторы

Стандартные операторы запроса

Слайд 21

Where - возвращает подмножество элементов, удовлетворяющих переданному условию
Take - возвращает первые n элементов, отбрасывая остальные
Skip - отбрасывает

Where - возвращает подмножество элементов, удовлетворяющих переданному условию Take - возвращает первые
первые n элементов и возвращает оставшиеся
TakeWhile - извлекает элементы из входящей последовательности пока переданный предикат возвращает true
SkipWhile - отбрасывает элементы из входящей последовательности пока переданный предикат возвращает true, затем возвращает остаток
Distinct - возвращает коллекцию с исключенными повторами

Фильтрующие операторы

Слайд 22

Select - преобразует каждый элемент входящей последовательности с помощью переданного лямбда выражения
SelectMany - преобразует

Select - преобразует каждый элемент входящей последовательности с помощью переданного лямбда выражения
элементы нескольких входящих последовательностей и объединяет получившиеся последовательности в одну (одноуровневую)

Проецирующие операторы

Слайд 23

Join - объединяет элементы из двух последовательностей в один одноуровневый набор
GroupJoin - объединяет

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

Объединяющие операторы

Слайд 24

Упорядочивающие операторы:
OrderBy, ThenBy - возвращают элементы отсортированные в возрастающем порядке
OrderByDescending, ThenByDescending - возвращают

Упорядочивающие операторы: OrderBy, ThenBy - возвращают элементы отсортированные в возрастающем порядке OrderByDescending,
элементы отсортированный в убывающем порядке
Reverse - возвращает элементы в обратном порядке
Группирующие операторы:
GroupBy - группирует элементы последовательности в подмножества (подпоследовательности)

Операторы запросов

Слайд 25

Concat - объединяет две последовательности
Union - объединяет две последовательности, удаляя повторы
Intersect -

Concat - объединяет две последовательности Union - объединяет две последовательности, удаляя повторы
возвращает элементы, присутствующие в обеих последовательностях
Except - возвращает элементы первой последовательности, отсутствующие во второй

Операторы комплектовщики

Слайд 26

First, FirstOrDefault - возвращают первый элемент последовательности или первый элемент, удовлетворяющий переданному

First, FirstOrDefault - возвращают первый элемент последовательности или первый элемент, удовлетворяющий переданному
предикату
Last, LastOrDefault - возвращают последний элемент последовательности или последний элемент, удовлетворяющий переданному предикату
Single, SingleOrDefault - эквивалент First/FirstOrDefault, если совпадений больше одного, выбрасывает исключение
ElementAt, ElementAtOrDefault - возвращает элемент с указанной позицией
DefaultIfEmpty - возвращает элементы последовательности илиодноэлементную коллекцию со значением по умолчанию - default(TSource), если последовательность пуста

Элементные операторы

Слайд 27

Count, LongCount - возвращает общее число элементов во входящей последовательности или число

Count, LongCount - возвращает общее число элементов во входящей последовательности или число
элементов, удовлетворяющих переданному предикату
Min - возвращает наименьший элемент в последовательности
Max - возвращает наибольший элемент в последовательности
Sum - вычисляет сумму элементов в последовательности
Average - вычисляет среднее значение элементов в последовательности
Aggregate - выполняет пользовательскую агрегацию

Агрегирующие операторы

Слайд 28

Contains - возвращает true если входящая последовательность содержит переданный элемент
Any - возвращает true если

Contains - возвращает true если входящая последовательность содержит переданный элемент Any -
хотя бы один элемент последовательности удовлетворяет переданному предикату
All - возвращает true если все элементы последовательности удовлетворяют переданному предикату
SequenceEqual - возвращает true если вторая (переданная в качестве аргумента) последовательность содержит элементы идентичные элементам входящей последовательности

Операторы кванторы

Слайд 29

OfType - преобразует IEnumerable в IEnumerable, отбрасывая элементы неподходящего типа
Cast - преобразует IEnumerable в IEnumerable, выбрасывая исключение

OfType - преобразует IEnumerable в IEnumerable , отбрасывая элементы неподходящего типа Cast
если встречаются элементы неподходящего типа
ToArray - преобразует IEnumerable в T[]
ToList - преобразует IEnumerable в List
ToDictionary - преобразует IEnumerable в Dictionary
ToLookup - преобразует IEnumerable в ILookup
AsEnumerable - приводит последовательность к IEnumerable
AsQueryable - приводит последовательность к типу IQueryable

Преобразующие операторы

Слайд 30

Вывести в алфавитном порядке все имена, в составе букв которых содержится буква

Вывести в алфавитном порядке все имена, в составе букв которых содержится буква
«а».
string[] names = { "Толя", "Маша", "Даша", "Оля", "Алина" };
IEnumerable query = names
.Where(n => n.Contains("а"))
.OrderBy(n => n)
.Select(n => n);
foreach (string name in query)
MessageBox.Show(name);

Запросы LINQ

Слайд 31

Ключевое слово let вводит новую переменную параллельно переменной диапазона:
string[] names = {

Ключевое слово let вводит новую переменную параллельно переменной диапазона: string[] names =
"Петр", "Маша", "Марина", "Олег" };
IEnumerable query =
from n in names
let n_new = n.Replace("а", "")
orderby n_new
select n + " - " + n_new;

Ключевое слово let

Слайд 32

Пример: Найти в предложении все слова, начинающиеся на букву «м»:
IEnumerable query =

Пример: Найти в предложении все слова, начинающиеся на букву «м»: IEnumerable query
from c in "Мама мыла раму".Split()
where c.StartsWith("М") || c.StartsWith("м")
select c;
//С использованием новой переменной диапазона:
IEnumerable query =
from c in "Мама мыла раму".Split()
select c.ToUpper() into c_new
where c_new.StartsWith("М")
select c_new;
//Краткая запись:
IEnumerable query = "Мама мыла раму".Split()
.Select(c => c.ToUpper())
.Where(upper => upper.StartsWith("М"));

Запросы с продолжениями

Слайд 33

int[] arr1 = { 9, 10, 11 };
string[] arr2 = {

int[] arr1 = { 9, 10, 11 }; string[] arr2 = {
"а", "б"};
IEnumerable query =
from a1 in arr1
from a2 in arr2
select a1.ToString() + a2;
foreach (string name in query)
MessageBox.Show(name);
//Краткая запись запроса:
IEnumerable query = arr1.SelectMany (
a1 => arr2,
(a1, a2) => (a1.ToString() + a2));

Множественные генераторы

Слайд 34

Оператор объединения Join поддерживает эквивалентное объединение (т.е. объединяющее условие должно использовать оператор

Оператор объединения Join поддерживает эквивалентное объединение (т.е. объединяющее условие должно использовать оператор
эквивалентности).
Синтаксис:
from <внешн-переменная>  in  <внешн-последовательность> join <внутр-переменная> in <внутр-последовательность> on <внешн-ключ> equals <внутренний-ключ>

Операторы объединения

Слайд 35

Вывести список продуктов, купленных детьми.
var children = new[]
{
new { id =

Вывести список продуктов, купленных детьми. var children = new[] { new {
10, name = "Оля" },
new { id = 20, name = "Паша" }
};
var goods = new[]
{
new { id = 10, product = "Кораблик" },
new { id = 20, product = "Мяч" }
};

Операторы объединения

Слайд 36

Операторы объединения

IEnumerable query = from c in children
join p in goods

Операторы объединения IEnumerable query = from c in children join p in
on c.id equals p.id
select c.ame + " - " + p.product;
var query = children
.Join(goods, c => c.id, g => g.id, (c, g) => new { c, g });
foreach (var q in query)
Console.WriteLine(q.c.name + " - " + q.g.product);

Слайд 37

Простейший оператор объединения Zip – перебирает две последовательности за один проход и

Простейший оператор объединения Zip – перебирает две последовательности за один проход и
возвращает новую последовательность – результат выполнения функции над соответствующими парами элементов последовательностей:
int[] numbers = { 3, 5 }; string[] words = {"три", "пять", "семь" }; IEnumerable query =   numbers.Zip (words, (n, w) => n + " = " + w);
// Результат: 3 = three 5 = five

Операторы объединения

Слайд 38

Оператор GroupBy группирует одноуровневую входящую последовательность в последовательность групп:
string[] nm = { "Миша", "Маша",

Оператор GroupBy группирует одноуровневую входящую последовательность в последовательность групп: string[] nm =
"Ольга", "Зоя", "Тим" };
var query =
from name in nm
group name by name.Length;
string str = "";
foreach (IGrouping grouping in query)
{
str = " Длина имени = " + grouping.Key + ": ";
foreach (string name in grouping)
str += name + ", ";
MessageBox.Show(str);
}

Операторы группировки

Слайд 39

Примеры

Вывести на консоль все четные числа массива.
//Источник данных
int[] intNum = { 10,

Примеры Вывести на консоль все четные числа массива. //Источник данных int[] intNum
9, 8, 7, 6, 5, 4, 3, 2, 1 };
// Создаем запрос
var queryNumbers = from number in intNum
where (number % 2) == 0
select number;
//Выполнение запроса
foreach (int itemNumber in queryNumbers)
Console.WriteLine(itemNumber);

Слайд 40

Примеры

Вывести всех студентов, проживающих в Воронеже.

Примеры Вывести всех студентов, проживающих в Воронеже.

Слайд 41

Лабораторная работа 8

Вывести сведения о студентах, фамилии, либо имена которых начинаются на

Лабораторная работа 8 Вывести сведения о студентах, фамилии, либо имена которых начинаются
«И».
Вывести данные об оценках студентов второго курса, отсортированные по фамилии.
Вывести фамилии преподавателей и названия предметов которые они ведут.
Вывести фамилии и имена студентов, обучающихся на курсе не ниже 3 и получающих наибольшую стипендию.
Рассчитать среднюю оценку студентов, полученную на экзамене по информатике.

Слайд 42

Студенты:

Экзаменационные оценки:

Студенты: Экзаменационные оценки: