Практическое занятие 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!