Объединение двух несвязанных таблиц представлений с помощью 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>
Сущность 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 основан на табличном представлении, представляющем собой уплощенное представление более сложной табличной структуры для оптимизации поиска. Теперь я хочу иметь возможность получить все строки из Entity A, где Id находится в столбце "InvoiceId" в Entity B для конкретного значения "ResourceId" в Entity 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 ответ
В сценариях без явного отображения между нашими сущностями мы можем использовать только HQL.
- 14.2. Предложение from (небольшой текст и фрагмент)
Может появиться несколько классов, что приведет к декартовому произведению или кросс-соединению.
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 с Result Transformer...