Creatio development guide
PDF

Корневая схема. Построение путей к колонкам

Glossary Item Box

Общие сведения

Корневая схема — это схема (таблица в базе данных), относительно которой выполняется построение путей ко всем колонкам в запросе, в том числе к колонкам присоединяемых таблиц.

При построении путей к колонкам применяется принцип связей через справочные поля. Имя произвольной колонки, добавляемой в запрос, можно построить в виде цепочки взаимосвязанных звеньев, каждое из которых представляет собой "контекст" конкретной схемы, которая связывается с предыдущей по внешнему ключу (рис. 1).

Рис. 1. — Взаимосвязи схем по внешним ключам

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

[Контекст схемы 1].[...].[Контекст схемы N].[Имя_колонки]

Примеры формирования имени колонки для добавления колонки в запрос

К СВЕДЕНИЮ

Для всех приведенных ниже примеров в качестве корневой схемы выступает схема [City].

Пример 1

В этом случае имя колонки указывается как [Имя колонки в корневой схеме].

  • Колонка с названием города
  • Имя колонки: Name
  • Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
// Создание экземпляра запроса EntitySchemaQuery с корневой схемой "City".
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "City");

// Добавление в запрос колонки с именем города.
esqQuery.AddColumn("Name");

// Получение текста результирующего sql-запроса.
string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
  • Результирующий sql-запрос (MS SQL):
SELECT
[City].[Name] [Name]
FROM
[dbo].[City] [City]

Пример 2

Имя колонки настраивается по принципу [Имя колонки-справочника].[Имя колонки справочной схемы].

При этом в результирующем запросе к корневой схеме City оператором JOIN (по умолчанию — LEFT OUTER JOIN) будет присоединена справочная схема Country. Условие присоединения (условие ON оператора JOIN) формируется по следующему принципу:

[Имя присоединяемой схемы].[Id] = [Имя корневой схемы].[Имя справочной колонки, которая ссылается на присоединяемую схему + Id]

  • Колонка с названием страны, которой принадлежит город
  • Имя колонки: Country.Name
  • Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
// Создание экземпляра запроса EntitySchemaQuery с корневой схемой "City".
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "City");

// Добавление в запрос колонки с наименованием страны, которой принадлежит город.
esqQuery.AddColumn("Country.Name");

// Получение текста результирующего sql-запроса.
string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText();  
  • Результирующий sql-запрос (MS SQL):
SELECT
[Country].[Name] [Country.Name]
FROM
[dbo].[City] [City]
LEFT OUTER JOIN [dbo].[Country] [Country] ON ([Country].[Id] = [City].[CountryId])
  • Имя контакта, который добавил страну конкретного города
  • Имя колонки: Country.CreatedBy.Name
  • Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
// Создание экземпляра запроса EntitySchemaQuery с корневой схемой "City".
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "City");

// Добавление в запрос колонки с именем контакта, который добавил страну конкретного города.
esqQuery.AddColumn("Country.CreatedBy.Name");

// Получение текста результирующего sql-запроса.
string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText();   
  • Результирующий sql-запрос (MS SQL):
SELECT
[CreatedBy].[Name] [CreatedBy.Name]
FROM
[dbo].[City] [City]
LEFT OUTER JOIN [dbo].[Country] [Country] ON ([Country].[Id] = [City].[CountryId])
LEFT OUTER JOIN [dbo].[Contact] [CreatedBy] ON ([CreatedBy].[Id] = [Country].[CreatedById])

Пример 3

Имя колонки строится по принципу [Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы:Имя_колонки_для_связи_текущей_схемы].

Данный способ построения колонки подразумевает применение обратных связей, т.е. связи справочной колонки присоединяемой сущности с какой-либо колонкой основной сущности.

Если в качестве колонки для связи у текущей схемы выступает колонка Id, то в этом случае ее можно опустить, то есть имя колонки будет выглядеть следующим образом:

[Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы].

  • Колонка с именем контакта, в карточке которого указан выбираемый запросом город
  • Имя колонки: [Contact:City:Id].Name
  • Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
// Создание экземпляра запроса EntitySchemaQuery с корневой схемой "City".
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "City");

//  Добавление в запрос колонки с именем контакта, в карточке которого указан данный город.
esqQuery.AddColumn("[Contact:City:Id].Name");

// Получение текста результирующего sql-запроса.
string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
  • Результирующий sql-запрос (MS SQL):
SELECT
[Contact].[Name] [Contact.Name]
FROM
[dbo].[City] [City]
LEFT OUTER JOIN [dbo].[Contact] [Contact] ON ([Contact].[CityId] = [City].[Id])

К СВЕДЕНИЮ

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

В примере ниже рассматривается альтернативный вариант построения имени для колонки с именем контакта, добавившего страну конкретного города (см. пример 2).

  • Колонка с именем контакта, добавившего страну конкретного города
  • Имя колонки: Country.[Contact:Id:CreatedBy].Name
  • Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
// Создание экземпляра запроса EntitySchemaQuery с корневой схемой "City".
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "City");

// Добавление в запрос колонки с именем контакта, добавившего страну конкретного города.
esqQuery.AddColumn("Country.[Contact:Id:CreatedBy].Name");

// Получение текста результирующего sql-запроса.
string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText();
  • Результирующий sql-запрос (MS SQL):
SELECT
[Contact].[Name] [Contact.Name]
FROM
[dbo].[City] [City]
LEFT OUTER JOIN [dbo].[Country] [Country] ON ([Country].[Id] = [City].[CountryId])
LEFT OUTER JOIN [dbo].[Contact] [Contact] ON ([Contact].[Id] = [Country].[CreatedById])

© Terrasoft 2002-2019.

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

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