Корневая схема. Построение путей к колонкам
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])