ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 23
Скачиваний: 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
var students = new List
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); // студент