Файл: Существует несколько разновидностей linq.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 20

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

LINQ

LINQ (Language-Integrated Query) представляет язык запросов к источнику данных. В качестве источника данных может выступать коллекция или массив, набор данных DataSet, документ XML.

Существует несколько разновидностей LINQ:

  • LINQ to Objects: применяется для работы с массивами и коллекциями

  • LINQ to Entities: используется при обращении к базам данных через технологию Entity Framework

  • LINQ to XML: применяется при работе с файлами XML

  • LINQ to DataSet: применяется при работе с объектом DataSet

  • Parallel LINQ (PLINQ): используется для выполнения параллельных запросов

Для работы с коллекциями можно использовать два способа:

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

  • Методы расширений LINQ


string[] people = { "Tom", "Bob", "Sam", "Tim", "Tomas", "Bill" };

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

var selectedPeople = from p in people // передаем каждый элемент из people в переменную p

where p.ToUpper().StartsWith("T") //фильтрация по критерию

orderby p // упорядочиваем по возрастанию

select p; // выбираем объект в создаваемую коллекцию

foreach (string person in selectedPeople)

Console.WriteLine(person);
Операторы запросов LINQ


string[] people = { "Tom", "Bob", "Sam", "Tim", "Tomas", "Bill" };

var selectedPeople = people.Where(p => p.ToUpper().StartsWith("T")).OrderBy(p => p);

foreach (string person in selectedPeople)

Console.WriteLine(person);
Методы расширения LINQ

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


int number = (from p in people where p.ToUpper().StartsWith("T") select p).Count();

Console.WriteLine(number);
И хотя ряд действий мы можем реализовать как с помощью операторов запросов LINQ, так и с помощью методов расширений LINQ, но не каждый метод расширения имеет аналог среди операторов LINQ. И в этом случае можно сочетать оба подхода. Например, используем стандартный синтаксис linq и метод расширения Count(), который возвращает количество элементов в выборке:


var people = new List


{

new Person ("Tom", 23),

new Person ("Bob", 27)

};

var personel = from p in people

select new

{

FirstName = p.Name,

Year = DateTime.Now.Year - p.Age

};

foreach (var p in personel)

Console.WriteLine($"{p.FirstName} - {p.Year}");

record class Person(string Name, int Age);

Создание анонимного типа при выборке из коллекции


var personel = people.Select(p => new

{

FirstName = p.Name,

Year = DateTime.Now.Year - p.Age

});
Аналогично, но только с Extension Methods

Переменые в запросах и оператор let


var people = new List


{

new Person ("Tom", 23),

new Person ("Bob", 27)

};

var personnel = from p in people

let name = $"Mr. {p.Name}"

let year = DateTime.Now.Year - p.Age

select new

{

Name = name,

Year = year

};

foreach (var p in personnel)

Console.WriteLine($"{p.Name} - {p.Year}");

record class Person(string Name, int Age);
Иногда возникает необходимость произвести в запросах LINQ какие-то дополнительные промежуточные вычисления. Для этих целей мы можем задать в запросах свои переменные с помощью оператора let:

Возможность определения переменных наверное одно из главных преимуществ операторов LINQ по сравнению с методами расширения.


var courses = new List { new Course("C#"), new Course("Java") };

var students = new List { new Student("Tom"), new Student("Bob") };

var enrollments = from course in courses // выбираем по одному курсу

from student in students // выбираем по одному студенту

select new { Student = student.Name, Course = course.Title}; // соединяем каждого студента с каждым курсом

foreach (var enrollment in enrollments)

Console.WriteLine($"{enrollment.Student} - {enrollment.Course}");

record class Course(string Title); // учебный курс

record class Student(string Name); // студент
Выборка из нескольких источников