Статьи

Поднять планку с помощью LINQ

В выпуске 1.1 NuoDB мы добавили поддержку Microsoft .Net и Language INtegrated Queries (LINQ). В этой статье мы кратко рассмотрим доступ к хоккейной базе данных быстрого запуска NuoDB с помощью LINQ.

Что такое языковые интегрированные запросы?

LINQ  — это инновационная технология Microsoft, представленная в 2008 году, для разработки приложений баз данных путем написания запросов непосредственно на языках программирования приложений. Вы можете спросить, в чем дело?

Как мы проиллюстрируем в этом посте, LINQ помогает уменьшить страшное  несоответствие импеданса  между языками программирования и системами управления базами данных, расширяя синтаксис языка программирования, так что запросы могут быть написаны непосредственно на C #, VB или другом языке программирования, поддерживаемом LINQ.

При написании приложений с использованием LINQ разработчикам не нужно переключать контекст между мышлением на языке программирования приложений и мышлением на SQL. Мы просто используем систему типов, выражения и другие конструкции в нашем языке прикладного программирования для написания наших запросов. Это позволяет с легкостью кодировать предикаты выбора, находить связи между различными объектами, агрегировать наборы результатов запросов и другие функции доступа к базе данных.

В среде Visual Studio мы также можем использовать все обычные инструменты разработчика для завершения символов, установки точек останова в отладчике и проверки значений переменных, включая результаты запросов.

Быстрый старт NuoDB в LINQ

Чтобы проиллюстрировать программирование с помощью LINQ, мы собираемся использовать базу данных быстрого старта NuoDB профессиональных хоккейных команд, игроков и статистику сезона в Северной Америке. Наша база данных быстрого старта основана на проекте Хоккейный банк данных [1]  , набор данных с информацией о почти 5000 игроков и статистикой сезонов за 100 лет для этих игроков и команд, в которых они играли.

На следующей диаграмме, взятой из инструмента Visual Studio для импорта схем базы данных, мы видим 3 объекта, которые составляют схему базы данных быстрого запуска NuoDB:

  • Таблица MASTER содержит биографическую информацию о каждом игроке, когда и где он родился, а также о количестве лет, в течение которых он был активен в хоккейной лиге.
  • Таблица TEAMS содержит информацию о статистике сезона для каждой команды и года, включая количество сыгранных, выигранных, проигранных или проигранных в овертайме игр, итоговое положение в рейтинге и результаты плей-офф.
  • Таблица подсчета очков содержит информацию о статистике сезона для отдельных игроков, позиции, в которой они играли, количестве игр, забитых мячей, количестве голов и штрафных минутах.  
    Обратите внимание, что SCORING представляет отношения «многие ко многим» между командами и игроками с течением времени. Поскольку игроки могут менять команды в середине сезона, атрибут STINT указывает, когда игрок играл за более чем одну команду в течение сезона.
LINQ-схема

Примечание для хоккейных фанатов: мы используем подмножество Хоккейного банка данных, полный набор данных содержит множество дополнительных статистических данных о командах и игроках, статистику целей и тренеров, награды, статистику после сезона, разделение игр и статистику команд в команде. ,

Добавление сущностей и запросов

Давайте посмотрим на некоторые конструкции манипулирования данными в LINQ.

Вот фрагмент кода для добавления новой команды в нашу примерную базу данных. Мы просто создаем новый объект C #, устанавливаем значения его атрибутов, используя обычные операторы присваивания, добавляем новый объект в коллекцию команд и сохраняем наши изменения:

testEntities ctx = new testEntities();
    TEAMS team = new TEAMS();
    team.TMID = "BOS";
    team.YEAR = 2013;
    team.CONFID = "EC";
    team.DIVID = "SE";
    team.PLAYOFF = "0";
    team.OTL = "0";
    team.NAME = "Boston Bruins";
    ctx.TEAMS.AddObject(team);
    ctx.SaveChanges();

Это было легко, но пока это не сильно отличается от кодирования с использованием инфраструктуры объектно-реляционного отображения (ORM), такой как Active Record в Ruby on Rails или Hibernate в Java. LINQ действительно хорошо подходит для написания запросов: от простого поиска в одной таблице с одним предикатом выбора до сложных запросов, которые выбирают из нескольких таблиц и агрегируют или сортируют результаты по нескольким атрибутам. В большинстве сред ORM не так просто писать нетривиальные запросы, и обычно это требует написания запроса непосредственно в SQL.

Наш первый запрос, иди Bruins!

Для нашего первого примера мы напишем простой запрос, чтобы показать рейтинг Бостонских Брюинз за каждый сезон, начиная с 2003 года:

var bostonStats = from team in ctx.TEAMS
        where team.TMID == "BOS" && team.YEAR > 2003
        select team;

    foreach ( TEAMS t in bostonStats )
        Console.WriteLine( t.YEAR + " " + t.TMID+” “ + t.RANK );

И вот результаты запроса. Похоже, у Брюинз в последнее время все хорошо. Как вы можете видеть с помощью LINQ, написание запроса на C # очень естественно. Выражение для выбора команд, которые мы хотим найти, является точно такой же языковой конструкцией, которую мы написали бы, если бы у нас был цикл с оператором if. Теперь это мощно и делает задачу написания приложений базы данных намного быстрее и намного менее подвержена ошибкам.


Year  Team  Rank 2003   BOS   1 2005   BOS   5 2006   BOS   5 2007   BOS   3 2008   BOS   1 2009   BOS   3 2010   BOS   1 2011  BOS   1

Второй запрос, игроки из Словакии?

Немного более сложный запрос показывает нам статистику очков игроков, которые родились в Словакии:

var slovakianStats = from player in ctx.MASTER
         where player.BIRTHCOUNTRY == "Slovakia"
         orderby player.LASTNAME
         select new
            {
              player.LASTNAME, player.FIRSTNAME, player.SCORING
            };

     foreach (var t in slovakianStats)
         {
            Console.WriteLine(t.LASTNAME + " " + t.FIRSTNAME);
            foreach(var s in t.SCORING)
                {
                  Console.WriteLine("\t" + s.YEAR + " " + s.TMID 
                      + " " + s.GP + " " + s.G);
                }
         }

В этом запросе мы использовали сложный тип для встраивания статистики выигрыша в каждого игрока в качестве значения player.SCORING . Вот результаты:

Baca Jergus
        1990 HAR 9 0
        1991 HAR 1 0
    Balej Jozef
        2003 NYR 13 1
        2005 VAN 1 0
        2003 MTL 4 0

Запрос 3, лучшие новички?

И, наконец, вот пример, показывающий код LINQ для поиска новичков, которые играли за одну из команд с самым высоким рейтингом и которые также забили выше, чем средний балл всех игроков в данном сезоне.

LINQ-запрос

Инструменты IDE и LINQ

Мы можем легко установить точку останова отладки после первой части этого запроса и проверить элементы набора результатов для команд с самым высоким рейтингом в   переменной winners .

LINQ-ида-стек

Резюме

В этом кратком туре мы увидели, что написание приложений с использованием Language INtegrated Queries повышает уровень абстракции для доступа к базам данных и может помочь повысить производительность труда разработчиков на совершенно новом уровне.

Если вы еще не знакомы с последними инструментами Microsoft для разработки приложений, ознакомьтесь с ними. Следует также отметить, что LINQ доступен в других средах, поэтому, даже если вы не пишете в Windows, вы можете проверить его.

Следите за нашими будущими публикациями, в которых мы рассмотрим, как реляционные и расширенно-реляционные информационные модели сравниваются с документно-ориентированными базами данных JSON, шаблонами и анти-шаблонами для представления сложных структур данных и динамических схем в NuoDB, и другими смежными темами. ,

Пожалуйста, дайте нам знать, что вы думаете и о чем вы хотели бы, чтобы мы писали дальше.