LINQ
В приложениях часто используются данные из баз данных SQL или XML-документов. Традиционно, разработчики должны были изучить как основной язык программирования, такой как C #, так и дополнительный, например SQL или XQuery. LINQ (Language-Integrated Query) предоставляет возможность осуществлять запросы на самом языке C#. Теперь, вместо изучения отдельного языка запросов, можно выполнять запросы к базам данных SQL, наборам данных ADO.NET, XML-документам и любым классам коллекций .NET Framework, реализующих интерфейс IEnumerable, используя знание C# и нескольких дополнительных ключевых слов и основных понятий.
Преимущества использования LINQ
- Знакомый синтаксис для написания запросов
- Проверка на наличие ошибок синтаксиса и на безопасность типа при компиляции.
- Улучшенная поддержка отладчика
- Поддержка IntelliSense
- Возможность напрямую работать с XML-элементами вместо создания контейнера XML-документа, что было необходимо при использовании объектной модели документа (DOM) W3C.
- Изменение XML-документа в памяти, что более эффективно, чем простое использование XPath или XQuery.
- Эффективные функции фильтрации, сортировки и группировки.
- Согласованная модель для работы с источниками данными различных типов и форматов.
Простой пример
class LINQQueryExpressions
{
static void Main()
{
int[] scores = new int[] { 97, 92, 81, 60 };
// Создаем и выполняем запрос
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Выводим результат на экран
// Выводит только числа, большие 80
// 97, 92, 81
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
Пример запроса, сортирующего данные по убыванию
int[] scores = { 90, 71, 82, 93, 75, 82 };
IEnumerable<int> scoreQuery =
from score in scores // обязательно
where score > 80 // опционально. Оставляем только числа, большие 80
orderby score descending // опционально. Сортируем по убыванию
select score;
Свойства запроса
int[] scores = { 90, 71, 82, 93, 75, 82 };
// Получения максимума из всех чисел, меньших 90
int highestScore =
(from score in scores
where score < 90
select score)
.Max(); // 82
Сложный запрос
int[] scores = { 90, 71, 82, 93, 75, 82 };
// Все числа, меньшие 90, но большие 72
IEnumerable<int> middle =
from score in scores
where score < 90 && score > 72
select city; // 75, 82
Работа с XML
Предположим, у нас есть такой XML файл data.xml
<root>
<level1 name="A">
<level2 name="A1" />
<level2 name="A2" />
</level1>
<level1 name="B">
<level2 name="B1" />
<level2 name="B2" />
</level1>
<level1 name="C" />
</root>
И мы хотим вывести в консоль имена элементов на первом и втором уровне
A
A1
A2
B
B1
B2
C
// Для создания итоговой строки
StringBuilder result = new StringBuilder();
// Загружаем файл
XDocument xdoc = XDocument.Load("data.xml");
// Выполняем запрос
var lv1s = from lv1 in xdoc.Descendants("level1")
select new { // Создаем новый объект со свойствами Header и Children
Header = lv1.Attribute("name").Value,
Children = lv1.Descendants("level2")
};
// Для каждого результата
foreach (var lv1 in lv1s){
result.AppendLine(lv1.Header);
foreach(var lv2 in lv1.Children){
result.AppendLine(" " + lv2.Attribute("name").Value);
}
}
Console.WriteLine(result);