Что такое LINQ?

Разработчики во всем мире всегда сталкивались с проблемами при запросе данных из-за отсутствия определенного пути и необходимости освоения множества технологий, таких как SQL, веб-службы, XQuery и т. д.

Представленный в Visual Studio 2008 и разработанный Андерсом Хейлсбергом, LINQ (Language Integrated Query) позволяет писать запросы даже без знания языков запросов, таких как SQL, XML и т. д. Запросы LINQ можно писать для различных типов данных.

У нас уже есть ADO.NET, так зачем еще одна технология доступа к данным?

Большинство приложений работают с данными в той или иной форме, а это означает, что данные очень важны для работы, которую мы выполняем как инженеры-программисты. Очень важно, чтобы инструменты, которые мы используем, постоянно развивались, а следующее поколение создавало и улучшало предыдущее. Это не изменилось с LINQ, который представляет собой следующий гигантский скачок в технологии разработки данных после ADO.NET.

ADO.NET является объектно-ориентированной библиотекой, но мы все же должны рассуждать о данных с реляционной точки зрения. В простых сценариях мы можем привязать объекты ADO.NET непосредственно к пользовательскому интерфейсу (UI), но во многих других ситуациях требуется преобразование данных ADO.NET в бизнес-объекты с отношениями, правилами и семантикой, которые не преобразуются автоматически из реляционное хранилище данных. Например, реляционное хранилище данных будет моделировать Orders и Customers с помощью внешнего ключа из таблицы Order в таблицу Customer, но объектное представление этих данных — это объект Customer с коллекцией объектов Order. Аналогичные ситуации возникают и для других типов хранилищ, таких как иерархические, многозначные и неструктурированные источники данных. Этот разрыв между представлением данных из хранилища и объектами, которые вы используете в своих приложениях, называется несоответствием импеданса. В то время как ADO.NET — это библиотека объектов для работы с реляционными данными, LINQ — это SQL-подобный синтаксис, который создает пригодные для использования объекты. LINQ помогает уменьшить это несоответствие импеданса.

Архитектура LINQ в .NET

LINQ имеет трехуровневую архитектуру, в которой самый верхний уровень состоит из языковых расширений, а нижний уровень состоит из источников данных, которые обычно являются объектами, реализующими универсальные интерфейсы IEnumerable‹T› или IQueryable‹T›. Архитектура показана ниже на рисунке.

Выражения запроса

Выражение запроса — это не что иное, как запрос LINQ, выраженный в форме, аналогичной форме SQL, с такими операторами запроса, как Select, Where и OrderBy. Выражения запроса обычно начинаются с ключевого слова «От».

Для доступа к стандартным операторам запросов LINQ пространство имен System.Query должно быть импортировано по умолчанию. Эти выражения написаны с использованием декларативного синтаксиса запросов, который был C# 3.0.

Пример кода:

// LINQ-запрос

/*

var bmws = из машины в myCars

где car.Make == «BMW»

&& автомобиль.Год == 2010

выбрать автомобиль;

*/

/*

varorderedCars = из машины в myCars

заказпо машине.Год по убыванию

выбрать автомобиль;

*/

// LINQ-метод

//var bmws = myCars.Where(p =› p.Make == «BMW» && p.Year == 2010);

//varorderedCars = myCars.OrderByDescending(p =› p.Year);

/*

var firstBMW = myCars.OrderByDescending(p => p.Year).First(p => p.Make == «BMW»);

Console.WriteLine(firstBMW.VIN);

*/

//Console.WriteLine(myCars.TrueForAll(p => p.Year › 2007));

//myCars.ForEach(p =› p.StickerPrice -= 3000);

//myCars.ForEach(p => Console.WriteLine("{0} {1:C}", p.VIN, p.StickerPrice));

//Console.WriteLine(myCars.Exists(p =› p.Model == «745li»));

//Console.WriteLine(myCars.Sum(p => p.StickerPrice));

/*

foreach (var car в упорядоченных автомобилях)

{

Console.WriteLine("{0} {1}", машина.Год, машина.Модель, машина.VIN);

}

*/

Справочные ссылки:

1. https://csharp-station.com/Tutorial/Linq/Lesson01

2. https://www.tutorialspoint.com/linq/linq_overview.htm