使用NHibernate查询语言HQL将表与另一个数据库中的另一个表联接

时间:2019-02-05 14:40:02

标签: c# sql-server linq nhibernate hql

我正在尝试使用NHibernate从另一个数据库联接一个表。我基本上在表名前添加了我在映射文件中已经完成的数据库名称的前缀,并且该名称已经起作用。

请在下面查看我的代码:

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

但是,我收到以下错误消息:

  

NHibernate.QueryException:无法解析属性:OtherDatabase of:XXX.XXXXX.Core.Domain.Catalog.Product

在NHibernate中可以这样做吗?我假设由于没有将两个表联系在一起的外键,也许我需要指定两个表需要连接在哪一列上?

1 个答案:

答案 0 :(得分:1)

支持与其他数据库/表(可通过当前连接访问)。这里的事情是..此类表的路径必须来自映射。

我们可以使用标准映射类,也可以仅引入动态字典映射。例如。

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

没有映射关系的加入

  

尽管标题有关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

以防万一,我们到otherDB / Table的映射将包含一个关系(例如,多对一)..我们甚至可以使用标准CreateAlias ..但仍然...我们越过边界当前数据库的..必须来自映射