Практическое занятие 7. Создание запросов на языке C# (LINQ)



В упражнениях этого занятия реализуются возможности языка C#, которые служат для написания выражений запросов LINQ.

После выполнения этого упражнения можно переходить к работе с конкретными поставщиками LINQ, например, LINQ to SQL, LINQ в DataSet или LINQ to XML.

Создание проекта

1. Создайте консольное приложение, назовите его Linq_Student.

2. Обратите внимание, что проект содержит ссылку на System.Core.dll и директиву using для пространства имен System.Linq.

Создание расположенного в памяти источника данных

Источником данных для запросов в этом упражнении является список объектов Student. Каждая запись Student имеет имя, фамилию и массив целых чисел, представляющий результаты тестирования.

1. Добавьте класс Student.

2. Добавьте инициализированный список учащихся (создайте несколько студентов по обзазцу):

public class Student

{

public string First { get; set; }

public string Last { get; set; }

public int ID { get; set; }

public List<int> Scores;

}

 

static List<Student> students = new List<Student>

{

new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},

new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},

};

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

Упражнение 1. Создание и выполнение простого запроса

1. В методе Main создайте простой запрос, который при выполнении вернет список всех учащихся, результат тестирования которых, по первой оценке, превысил 90 баллов.

Указание. Поскольку объект Student выбирается целиком, типом запроса укажите IEnumerable<Student>:

IEnumerable<Student> studentQuery =

from student in students

where student.Scores[0] > 90

select student;

2. Реализуйте цикл foreach, который приведет к выполнению запроса:

foreach (Student student in studentQuery)

{

Console.WriteLine("{0}, {1}", student.Last, student.First);

}

Обратите внимание на следующие моменты.

· Доступ к каждому элементу в возвращаемой последовательности осуществляется с помощью переменной итерации в цикле foreach.

· Типом этой переменной является Student, а типом переменной запроса является совместимый IEnumerable<Student>.

3. Выполните построение и запустите приложение.

Упражнение 2. Изменение запроса

Добавление дополнительного условия фильтра

Чтобы уточнить запрос, можно объединить несколько логических условий в предложении where.

1. В предыдущий запрос добавьте условие таким образом, чтобы запрос возвращал тех учащихся, первый результат которых был более 90 баллов, а последний результат был меньше 80.

Предложение where должно выглядеть следующим образом:

where student.Scores[0] > 90 && student.Scores[3] < 80

Упорядочение результатов

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

1. Добавьте следующее предложение orderby к запросу, указав его после инструкции where и перед оператором select:

orderby student.Last ascending

2. Измените предложение orderby таким образом, чтобы оно сортировало результаты в обратном порядке по результату первого тестирования, от высшего к низшему показателю:

orderby student.Scores[0] descending

3. Измените строку форматирования WriteLine, чтобы видеть результаты тестирования:

Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);

Группировка результатов

Запрос с предложением group создает последовательность групп, где каждая группа содержит Key и последовательность, состоящую из всех членов этой группы.

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

var studentQuery2 =

from student in students

group student by student.Last[0];

Обратите внимание, что тип запроса изменился. Теперь он создает последовательность из групп, имеющих тип char в качестве ключа, и последовательность объектов Student.

2. Поскольку тип запроса изменился, измените также и цикл foreach:

foreach (var studentGroup in studentQuery2)

{

Console.WriteLine(studentGroup.Key);

foreach (Student student in studentGroup)

{

   Console.WriteLine(" {0}, {1}",

             student.Last, student.First);

}

}

                                                    

3. Запустите и протестируйте приложение.


Дата добавления: 2019-02-26; просмотров: 276; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!