Как можно использовать собственный sqlquery (session.CreateSqlQuery) в качестве подзапроса фильтрации в другом QueryOver:
// Get ids
var idsq = _session.CreateSQLQuery(
"select Id from [dbo].[SomeFunction](:parameter)")
.AddEntity(typeof(long)).
SetParameter("parameter", folderId);
// get entities by filtering where in (subquery)
MyEntity entityAlias = null;
var listOfEntities = await _session.QueryOver(() => entityAlias).
Where(x=>x.Id).IsIn(idsq).
OrderBy(x => x.Name).Asc.
ListAsync(cancelToken).ConfigureAwait(false);
Я не думаю, что вы легко сможете это сделать ... "Направление" должно быть: .WithSubquery.WhereProperty(x => x.Id).In(...), но тогда In требует запроса QueryOver.
Я не знаю, почему NH не может справиться с этим случаем, потому что должно быть легко встроить собственный SQL внутри where in () в сгенерированный sql или даже присоединиться к функции sql с табличным значением
Также см. andrewwhitaker.com/blog/2014/08/15/…, который предлагает использовать Projections.SqlFunction
@DavidKemp Спасибо, моя проблема решена принятым ответом





Вы не можете легко смешивать различные стили NHibernate ... Что вы можете сделать:
var crit = new SQLCriterion(SqlString.Parse("{alias}.Id IN (select Id from [dbo].[SomeFunction](?))"),
new object[] { folderId },
new IType[] { NHibernateUtil.Int64 });
а потом:
var listOfEntities = await _session.QueryOver(() => entityAlias)
.Where(crit)
.OrderBy(x => x.Name).Asc
Обратите внимание, как я изменил текстовый запрос, добавив {alias}.Id IN (...).
Большое спасибо, это сработало отлично, я думаю, что это обязательный трюк для устаревшей базы данных
NHibernate использует функцию в другом запросе «один ко многим» для связи «один ко многим» между MyEntity и другой дочерней таблицей коллекции. Есть ли у вас какие-либо предложения сделать это один раз без получения декартового результата
@HamidNaeemi Непонятно, о чем вы спрашиваете ... и это кажется довольно сложным ... вы должны задать другой вопрос.
Я не думаю, что вы можете сделать это так - вам нужно будет вернуть результат
idsqклиенту, что, вероятно, плохая идея, поскольку вы не знаете, насколько он велик. Вероятно, вы можете добавить[dbo].[SomeFunction]в собственный диалект sql и использовать его таким образом - см. nhibernate.info/blog/2009/03/13/… или ayende.com/blog/1720/using-sql-functions-in-nhibernate