Было несколько способов сделать это самым простым, что я обнаружил, - предоставить собственный SQL-диалект, который зарегистрировал мою функцию и затем использовал Session.CreateSQLQuery
для ее выполнения.
Вот пример пользовательского диалекта:
public class CustomMsSql2012Dialect : MsSql2012Dialect
{
public CustomMsSql2012Dialect ()
{
RegisterFunction("dbo.testfunction", new SQLFunctionTemplate(NHibernateUtil.Int32, "dbo.TestFunction(?1, ?2)"));
}
}
Обратите внимание, что имя функции в первой строке, переданной RegisterFunction
, написано строчными буквами, в моем исследовании я встретил человека, который сказал, что это необходимо, но, к сожалению, сейчас я не могу найти эту статью для цитирования.
Как пользоваться диалектом:
MsSqlConfiguration.MsSql2012.ConnectionString("connectionStringHere")
.Dialect<EkaMsSql2012Dialect>();
Как вызвать функцию:
Session.CreateSQLQuery("SELECT dbo.TestFunction( :value1, :value2 )")
.SetString("value1", 5)
.SetString("value2", 6)
.UniqueResult<int>();