Соединить таблицу с другой таблицей в отдельной базе данных с помощью языка HQL NHibernate Query - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь присоединиться к таблице из другой базы данных, используя NHibernate.Я в основном префикс имени таблицы с именем базы данных, которое я сделал в файлах отображения ранее, и это сработало.

Пожалуйста, смотрите мой код ниже:

query.CreateAlias("OtherDatabase.SiteProduct","OtherDatabase.SiteProduct", JoinType.InnerJoin);

Однако я получаю следующее сообщение об ошибке:

NHibernate.QueryException: не удалось разрешить свойство: OtherDatabase of: XXX.XXXXX.Core.Domain.Catalog.Product

Возможно ли это сделать в NHibernate?Я предполагаю, что поскольку не существует внешнего ключа, связывающего две таблицы, возможно, мне нужно указать, к какому столбцу нужно объединить две таблицы?

1 Ответ

0 голосов
/ 08 февраля 2019

Работа с другими БД / таблицей (доступно при текущем соединении) поддерживается.Дело в том, что ... путь к такой таблице должен исходить из картографирования.

Мы можем использовать либо стандартный отображаемый класс, либо мы можем ввести только динамическое диктовское отображение.Например,

<class entity-name="OtherDBTable" table="[otherDB].[schema].[Table]" ... >
  <id       name="ID"           column="id"      type="Int32" />
  <property name="PropertyName" column="ColName" type="String" />
  ...
</class>

JOIN без сопоставленного отношения

Несмотря на заголовок .. о HQL .. неправильное выражение

query.CreateAlias("...

, похоже, принадлежит CreateriaQuery ... который мы будем использовать для присоединения к этой таблице

Итак, давайте создадим стандартный CriteriaQuery

var query = session.CreateCriteria<MyInnerEntity>("rootAlias");

И мы можем присоединить его к другой динамически отображаемой БД / таблице.как это

query.CreateEntityAlias("otherAlias",
    Restrictions.EqProperty("rootAlias.OtherId", "otherAlias.ID"),
    JoinType.InnerJoin,
    "OtherDBTable"
);

и мы можем получить результаты

query.SetProjection(Projections.ProjectionList()
    .Add(Projections.Property("rootAlias.ID"))
    .Add(Projections.Property("rootAlias.OtherId"))
    .Add(Projections.Property("otherAlias.ID"))
    .Add(Projections.Property("otherAlias.PropertyName"))
);

и, наконец, мы можем прочитать его как список массивов (или преобразовать его ...)

var list = query.List<object[]>();

JOIN с отображенным отношением

в случае, если наше отображение на другой DB / Table будет содержать отношение (например, многие-к-одному) .. мы могли бы даже использовать стандарт CreateAlias ... но все же... тот факт, что мы пересекли границы текущей БД .. должен исходить из отображения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...