Чтение мультиязычных данных с помощью EntitySchemaQuery
Glossary Item Box
Общая информация
Начиная с версии 7.8.3, bpmonline поддерживает работу с мультиязычными данными. Это означает, что данные в реестре отображаются в соответствии с языковой культурой пользователя. Детальная информация о локализации данных приведена в разделе "Работа со структурой данных".
Чтение мультиязычных данных с помощью EntitySchemaQuery
EntitySchemaQuery (ESQ) — основной механизм чтения данных из базы данных в bpm'online. Работу с мультиязычными данными 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.