У меня есть приложение NHibernate, которое в настоящее время использует пользовательскую функцию SQL Server. Я хотел бы избежать вызова этой функции и вместо этого выразить ее логику с помощью API критериев NH. К сожалению, у меня возникли трудности с применением примеров критериев в документации NH к моему конкретному случаю. Поэтому обращаюсь к этому сайту за помощью.
Вот функция. Он принимает один строковый аргумент и возвращает таблицу. Функция выполняет 3 соединения между одними и теми же двумя таблицами, но с разными критериями соединения, а затем объединяет результат.
Любые подсказки будут оценены. Заранее спасибо!
Изменить: это предназначено для NH 2.1.
Изменить. В комментарии к принятому ответу говорится, что преобразование невозможно, что является правильным ответом.
CREATE FUNCTION dbo.GetRevisionText
(
@LangId NVARCHAR(16)
)
RETURNS TABLE
AS
RETURN
(
SELECT r.RevisionId,
COALESCE(lp1.Title, lp2.Title, lp3.Title) Title,
COALESCE(lp1.Description, lp2.Description, lp3.Description) Description
FROM Revision r
LEFT JOIN LocalizedProperty lp1
ON lp1.RevisionId = r.RevisionId
AND lp1.LanguageId = @LangId
LEFT JOIN LocalizedProperty lp2
ON lp2.RevisionId = r.RevisionId
AND lp2.LanguageId = LEFT(@LangId, 2)
LEFT JOIN LocalizedProperty lp3
ON lp3.RevisionId = r.RevisionId
AND lp3.LanguageId = r.DefaultPropertiesLanguage
);
Вот сопоставление для трех задействованных классов:
<class name="Revision">
<id name="RevisionId" type="Guid">
<generator class="assigned"/>
</id>
<set name="LocalizedProperties" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="RevisionId"/>
<one-to-many class="LocalizedProperty"/>
</set>
<many-to-one name="DefaultPropertiesLanguage" class="Language" not-null="true"/>
</class>
<class name="Language">
<id name="LanguageId" type="String" length="16">
<generator class="assigned"/>
</id>
<property name="Lcid" type="Int32" unique="true" not-null="true"/>
</class>
<class name="LocalizedProperty" mutable="false">
<composite-id>
<key-many-to-one name="Revision" class="Revision" column="RevisionId"/>
<key-many-to-one name="Language" class="Language" column="LanguageId"/>
</composite-id>
<property name="Title" type="String" length="200" not-null="true"/>
<property name="Description" type="String" length="1500" not-null="false"/>
</class>