This article is currently in the process of being translated into Russian (~99% done).
Introduction
LINQ, сокращенное от Language-Integrated Query(язык интегрированных запросов), технология встроенная в .NET framework, которая позволяет легко обращаться и работать с данными из разных источников. Проще говоря, вы можете легко работать с различными данными, неважно это простой список, словарь , XML файл или таблица баз данных. LINQ существует в двух разновидностях: Запрос и синтаксис метода. В этой статье, мы тщательно изучим каждый из них, но чтобы заинтересовать вас изучить LINQ , позвольте мне быстро продемонстрировать как изящно LINQ может осуществлять запросы к простым данным:
var names = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Get the names which are 8 characters or less, using LINQ
var shortNames = from name in names where name.Length <= 8 orderby name.Length select name;
foreach (var name in shortNames)
Console.WriteLine(name);
В одной строке, используя LINQ синтаксис запросов, я могу запросить все имена в списке длиной 8 символов (или меньше) и отсортировать их по длине! Это всего лишь ОДНА строка кода, и она показывает лишь небольшую часть того, на что способен LINQ! В следующих статьях я рассмотрю все удивительные возможности, которые вы получаете при использовании LINQ, но сначала мы должны немного поговорить о том, как и когда выполняется запрос LINQ.
Отложенное выполнение
Большинство программистов привыкли к тому, что код выполняется строка за строкой, поэтому вас может удивить то, что запрос LINQ не выполняется как только строка с частью запроса будет пройдена. Вместо этого LINQ выполняется, как только вы начинаете использовать данные, например, когда вы обходите его результаты или вызываете такой метод, как ToList () или Count (). Это также означает, что вы можете построить запрос в несколько строк, где вы выполняете несколько операций, но данные фактически не извлекаются, пока вам это не нужно. Позвольте мне проиллюстрировать это расширенной версией нашего предыдущего примера, где мы переключаемся на синтаксис методов вместо предыдущего синтаксиса
var names = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Get the names which are 8 characters or less, using LINQ
var shortNames = names.Where(name => name.Length <= 8);
// Order it by length
shortNames = shortNames.OrderBy(name => name.Length);
// Add a name to the original list
names.Add("Zoe Doe");
// Iterate over it - the query has not actually been executed yet!
// It will be as soon as we hit the foreach loop though!
foreach (var name in shortNames)
Console.WriteLine(name);
Я добавил несколько комментариев к коду, для лучшего понимания. Также обратите вниманиена следующее: после выполнения запроса я добавляю имя в исходный список. Если запрос уже выполнен, то добавленное имя не попадёт в результат запроса, поскольку новое значение добавляется после запроса, но ДО того, как мы фактически используем данные в цикле foreach.
Это не имеет большого значения при запросе небольшого списка с 4 или 5 именами, но представьте, что произойдёт при запросе к списку из 10 миллионов записей (возможно к удаленной базе данных). В этом случае очень важно, чтобы мы не выполняли несколько запросов, когда возможно выполнить один запрос.
Резюме
LINQ позволяет просто и естественным образом строить запросы к различным источникам данных, используя либо синтаксис запросов, либо синтаксис методов, который мы обсудим в следующей статье.