Та же проблема, с которой я столкнулся, и я не получил никаких решений. Так что я взломал перехватчик
Запрос, сгенерированный критериями
SELECT u.Id as Id,
u.Login as Login,
u.FirstName as FirstName,
u.LastName as LastName,
gm.UserGroupId_FK as UserGroupId,
inner.Data1,
inner.Data2,
inner.Data3
FROM dbo.User u inner join
dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK
InnerJoin inner ON inner.UserAnchorId_FK = u.Id
WHERE gm.UserGroupId_FK = 195
Здесь InnerJoin - фиктивная таблица, которая имеет отношение 1-1 к пользователю.
Столбцы в InnerJoin являются возвращаемыми значениями подзапроса внутреннего соединения
Критерии для пользователя и InnerJoin
DetachedCriteria forUser = DetachedCriteria.For<User>();
forUser.CreateCriteria("InnerJoin");
Теперь вы можете сделать перехватчик для редактирования запроса
public interface CustomInterceptor : IInterceptor, EmptyInterceptor
{
SqlString IInterceptor.OnPrepareStatement(SqlString sql)
{
string query = sql.ToString();
if (query.Contains("InnerJoin "))
{
sql = sql.Replace("InnerJoin ", "(select [vals] form dbo.DailyInfo [where conditions])");
}
return sql;
}
}
Для значений Return из нескольких таблиц, включая объединенный подзапрос, вы можете использовать NHibernate DTO
И сессия такова
CustomInterceptor custonInterceptor=new CustomInterceptor();
sessionFactory.OpenSession(custonInterceptor);
И последний запрос будет похож на то, что именно вы хотите получить