Creatio development guide
PDF
Это документация Creatio версии 7.16.0. Мы рекомендуем использовать новую версию документации.

Чтение локализованных данных с помощью EntitySchemaQuery

Glossary Item Box

Общая информация

Начиная с версии 7.8.3, поддерживает работу с мультиязычными данными. Это означает, что данные в реестре отображаются в соответствии с языковой культурой пользователя. Детальная информация о локализации данных приведена в разделе "Работа со структурой данных".

Чтение мультиязычных данных с помощью EntitySchemaQuery

EntitySchemaQuery (ESQ) — основной механизм чтения данных из базы данных в Creatio. Работу с мультиязычными данными ESQ поддерживает по умолчанию.

Выборка мультиязычных данных формируется по следующим правилам:

  • Пользователи с основной культурой получают данные из основной таблицы.
  • Пользователи с дополнительной культурой получают данные из таблицы локализации. Если в таблице локализации для культуры пользователя нет данных, то возвращаются данные из основной таблицы.

Пример формирования запроса к локализуемой колонке

Пример кода формирования запроса к локализуемой колонке [Название] схемы объекта [City] на стороне сервера (C#):

// Пользовательское подключение.
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
// Формирование запроса.
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "City");
// Добавление колонки в запрос.
esqResult.AddColumn("Name");
// Выполнение запроса к базе данных и получение всей результирующей коллекции объектов.
var entities = esqResult.GetEntityCollection(userConnection);
// Получение текста запроса.
var s = esqResult.GetSelectQuery(userConnection).GetSqlText();
// Возврат результата.
return s;

Этот код можно добавить, например, в метод пользовательского конфигурационного сервиса.

Если в профиле пользователя установлена культура по умолчанию, то будет сформирован следующий SQL-запрос:

SELECT
    [City].[Name] [Name]
FROM
    [dbo].[City] [City] WITH(NOLOCK)

Если в профиле пользователя установлена культура, отличная от культуры по умолчанию, то сформированный SQL-запрос будет учитывать локализованные значения для установленной культуры:

SELECT
    ISNULL([SysCityLcz].[Name], [City].[Name])[Name]
FROM
    [dbo].[City] [City] WITH(NOLOCK)
    LEFT OUTER JOIN [dbo].[SysCityLcz] [SysCityLcz] WITH(NOLOCK) ON ([SysCityLcz].[RecordId] = [City].[Id]
    AND [SysCityLcz].[SysCultureId] = @P1)

Здесь параметр @P1 принимает значение идентификатора записи (Id) установленной культуры из таблицы SysCulture.

Отключение механизма локализации данных

Для отключения механизма выборки локализованных данных, даже если запрос выполняется от имени пользователя с дополнительной культурой, необходимо у экземпляра ESQ установить значение false для свойства UseLocalization.

// Пользовательское подключение.
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
// Формирование запроса.
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "City");
// Добавление колонки в запрос.
esqResult.AddColumn("Name");
// Отключение механизма выборки локализуемых данных.
esqResult.UseLocalization = false;
// Выполнение запроса к базе данных и получение всей результирующей коллекции объектов.
var entities = esqResult.GetEntityCollection(userConnection);
// Получение текста запроса.
var s = esqResult.GetSelectQuery(userConnection).GetSqlText();
// Возврат результата.
return s;

Независимо от того, какая культура установлена в профиле пользователя, будет сформирован следующий SQL-запрос:

SELECT
    [City].[Name] [Name]
FROM
    [dbo].[City] [City] WITH(NOLOCK)

Выборка данных для произвольной культуры

ESQ позволяет выполнить выборку данных для культуры, отличающейся от текущей культуры пользователя и культуры по умолчанию. Для того чтобы выбрать данные произвольной культуры, необходимо у экземпляра ESQ перед получением данных вызвать метод SetLocalizationCultureId(Guid cultureId) и передать в него Id культуры, данные которой необходимо получить.

// Пользовательское подключение.
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

// Получение Id нужной культуры, например, итальянской.
var sysCulture = new SysCulture(userConnection);
if (!sysCulture.FetchPrimaryInfoFromDB("Name", "it-IT"))
    {
    // Ошибка, запись не найдена.
    return "Культура не найдена";
}
Guid italianCultureId = sysCulture.Id;

// Формирование запроса.
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "City");
// Добавление колонки в запрос.
esqResult.AddColumn("Name");
// Установка необходимой локализации.
esqResult.SetLocalizationCultureId(italianCultureId);
// Выполнение запроса к базе данных и получение всей результирующей коллекции объектов.
var entities = esqResult.GetEntityCollection(userConnection);
// Получение текста запроса.
var s = esqResult.GetSelectQuery(userConnection).GetSqlText();
// Возврат результата.
return s;

В результате будет сформирован следующий SQL-запрос:

SELECT
    ISNULL([SysCityLcz].[Name], [City].[Name])[Name]
FROM
    [dbo].[City] [City] WITH(NOLOCK)
    LEFT OUTER JOIN [dbo].[SysCityLcz] [SysCityLcz] WITH(NOLOCK) ON ([SysCityLcz].[RecordId] = [City].[Id]
    AND [SysCityLcz].[SysCultureId] = @P1)

Здесь параметр @P1 принимает значение идентификатора записи (id), хранящееся в переменной italianCultureId.

© Terrasoft 2002-2020.

Был ли данный материал полезен?

Как можно улучшить эту статью?