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);

results matching ""

    No results matching ""