使用nhibernate和ICriteria连接两个不相关的视图表

时间:2014-10-13 07:52:42

标签: c# sql .net nhibernate icriteria

我有两个基于两个视图的实体。映射看起来像这样:

完全A:

<class name="SearchView" table="SearchView" dynamic-update="true" mutable="false" schema-action="none">
    <id name="Id" type="Guid" column="Id" />
    <property name="Id" column="Id" type="Guid" />
    <property name="Expires" column="Expires" type="DateTime" />
    <property name="VerificationNumber" column="VerificationNumber" type="Int32" />
    <property name="InvoiceNo" column="InvoiceNo" type="Int32" length="50" />
    <property name="Status" column="FakturaStatus" type="Int32" />
</class>

实体B:

<class name="SearchInvoiceResourceLookUpView" table="SearchInvoiceResourceLookUpView" dynamic-update="true" mutable="false" schema-action="none">
    <id name="Id" type="Guid" column="Id" />

    <property name="InvoiceId" column="InvoiceId" type="Guid" />
    <property name="ResourceId" column="ResourceId" type="Guid" />        
</class>

实体A 基于表视图,该表视图是更复杂的表结构的展平视图,用于搜索优化。现在,我希望能够从实体A 获取所有行,其中Id位于实体B 中的“InvoiceId”列中,以获取实体B 使用NHibernate和Criteria-API。这两个表都是视图,它们没有声明的关系。我在C#中尝试了以下代码,但它不起作用:

        var criteria = _session.CreateCriteria(typeof(SearchView));
            criteria.CreateAlias("SearchInvoiceResourceLookUpView", "srf",JoinType.InnerJoin)
                .Add(Restrictions.EqProperty("sfr.InvoiceId", "Id"))
                .Add(Restrictions.Eq("sfr.ResourceId", invoiceResId));

用于此目的的原始SQL将是:

SELECT * FROM SearchView
JOIN SearchInvoiceResourceLookUpView srf on srf.InvoiceId = Id 
WHERE srf.ResourceId = '[Inser resource id here]'

我该如何解决这个问题?

还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:3)

在我们的实体之间没有明确映射的情况下,我们可以使用 HQL。

  

可能会出现多个类,从而产生笛卡尔积或“交叉”连接。

from Formula, Parameter
from Formula as form, Parameter as param

所以在上面的例子中我们会有这样的HQL:

FROM SearchView AS sv, SearchInvoiceResourceLookUpView AS srf
WHERE srf.InvoiceId = sv.Id
AND srf.ResourceId = '[Inser resource id here]'

还应该使用一些SELECT,也许使用结果变换器的DTO ......