Использование LINQ для работы со словарем

Создание SQL словаря в реляционной СУБД

Для получения SQL скрипта, который сформирует структуру таблиц и заполнит их данными, используется утилита decompiler. В качестве источника она использует скомпилированный бинарный словарь. Все необходимые компоненты есть в составе полного SDK грамматического словаря, для приобретения которого необходимо связаться с разработчиками.

Для дальнешей работы с технологией LINQ нам понадобится загруженный в MS SQL словарь. На странице загрузокесть бесплатные демо-скрипты для некоторых типов СУБД, в том числе для MS SQL. Используйте его для начальных экспериментов. Этот скрипт создает практически полную схему словаря, но содержит минимальное количество словарных статей и связей тезауруса.

Приступая к работе со словарем с помощью Linq 2 Sql

Готовый демонстрационный проект, в котором показано использование возможностей языка C# для работы со словарем, входит в состав SDK Грамматического Словаря.

Чтобы самостоятельно начать работу, необходимо создать в VS 2008 новый проект C# для Windows (консольное приложение).

Затем добавляем в проект новый элемент, выбирая в диалоговом окне "LINQ 2 SQL":

LINQ

Удобно задать имя элемента так, как показано на скриншоте - с большой буквы, чтобы сгенерированный код выглядел более прилично.

Далее настраиваем в Студии новое соединение с сервером SQL, куда мы загрузили словарь, на боковой вкладке "Server Toolbox", и перетаскиваем таблицы словаря в окно дизайнера (там будет соответствющая надпись, предлагающая добавить таблицы).

Сохранив сгенерированную схему, мы получим набор классов, которые однозначно соответствуют таблицам словаря. Обратите внимание, что генератор кода при создании контекста доступа добавляет к именам таблиц окончания множественного числа в соответствии с правилами английского языка, поэтому таблица sg_entry представлена массивом объектов с именем sg_entries, таблица sg_class - массивом sg_classes, и так далее.

Собственно на этом подготовка закончена. В нашем распоряжении имеется объектное отображение для реляционной схемы словаря - именно для этого необходимы средства ORM, в нашем случае - доступная "из коробки" Entity Framework. Каждая таблица отображена на C#-класс, с дополнительными свойствами для зависимостей, которые генератор схемы взял из foreign keys таблиц словаря.

В работе эти классы ничем не отличаются от любых других классов C# - можно создавать объекты, обращаться к их свойствам. Но вместо явного написания циклов перебора объектов классов, например - словарных статей или словоформ, может быть удобнее использовать высокоуровневые средства языка C#. К числу таких средств, облегчающих работу, относятся анонимные типы, лямбда-функции и ленивое исполнение запросов. Далее будут рассмотрены соответствующие примеры.

Обычный императивный подход

Ничто не запрещает использовать старый добрый подход с ручным выстраиванием циклов для перебора элементов в схеме словаря, например так:

Entity Framework

Такие циклы просто отлаживать. Но у них есть трудно устранимые ручным кодированием недостатки, если сравнивать с возможностями LINQ.

Например, небольшая модификация задачи - перебор словарных статей в алфавитном порядке - резко усложняет изначально тривиальный алгоритм, так как сначала надо где-то отсортировать данные. Более того, если словарь большой, например русский словарь содержит более ста тысяч словарных статей, то выборка данных для сортировки займет немало времени и ресурсов. Обратите внимание, что данные фактически хранятся в БД и загружаются в оперативную память по мере создания соответствующих объектов. Этим занимается Entity Framework. Будет разумно переложить сортировку на SQL сервер, он это умеет делать очень хорошо. Драйвер LINQ 2 SQL как раз занимается тем, что транслирует манипуляции к массивами ORM объектов в SQL команды для сервера.

LINQ запросы к словарю

Упомянутый ранее LINQ запрос для вывода списка словарных статей с сортировкой по именам выглядит так:

Linq 2 Sql

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

LINQ

Каждая словарная статья привязана к определенной части речи - к грамматическому классу. В свою очередь каждый грамматический класс привязан к языку. Можно вывести список имен словарных статей с дополнительными полями - какая это часть речи:

LINQ

С дополнительным стобцом "к какому языку принадлежит":

LINQ

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

LINQ

Дополнительные материалы

SQL запросы к словарю

Экспорт словаря в SQL формат

ORM библиотека Persistent Dictionary

  © Козиев Илья 2019
изменено 14-Jul-12