Объединение двух несвязанных таблиц просмотра с помощью nhibernate и ICriteria

У меня есть две сущности, основанные на двух представлениях. Сопоставления выглядят следующим образом:

Сущность А:

<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>

Entity 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>

Entity A is based on a table view that is a flattened view of a more complex table-structure, for search optimization. Now i want to be able to get all the rows from Entity A where the Id is in column "InvoiceId" in Entity B for a specific value of "ResourceId" in Entity B by using NHibernate and the Criteria-API. The both tables are views and they have no declared relationship. I have tried the following code in C# but it doesn't work:

        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]'

Как решить эту проблему?

Есть ли другой, лучший способ сделать это?


person Spetastium    schedule 13.10.2014    source источник


Ответы (1)


В сценариях без явного сопоставления наших сущностей мы можем использовать только 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 с преобразователем результатов...

person Radim Köhler    schedule 13.10.2014
comment
Спасибо за этот ответ. Я полагаю, что это можно сделать и с Linq? - person Spetastium; 13.10.2014
comment
Не могу сказать о провайдере Linq от NHibernate... Я бы сказал, что теперь он работает с HQL, так что, возможно... но на самом деле не уверен... ;( Я предпочитаю Criteria, QueryOver или даже HQL... - person Radim Köhler; 13.10.2014
comment
Я попробую оба. Также необходимо включать или не включать параметры в запрос в зависимости от того, какие параметры предоставляются при поиске. - person Spetastium; 13.10.2014