Что такое 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);
}
*/
Справочные ссылки: