Вы можете вернуть только тип, для которого вы создаете критерии.
Самый простой способ, начиная с кода, который у вас есть, будет:
return
this.Session.CreateCriteria(typeof(SecurityGroup), "sg")
.CreateAlias("Members", "u")
.CreateAlias("Application", "al")
.Add(Restrictions.Eq("u.Id", user.Id))
.List<SecurityGroup>()
// get the lookup applications in memory
.SelectMany(x => x.LookupApplications);
Это загрузит все SecurityGroups
впамяти, даже если для этого нужны только LookupApplication
с.Это может не быть проблемой, когда они вам все равно нужны или когда они маленькие.
Вы также можете отменить запрос и начать с LookupApplication
return
this.Session.CreateCriteria(typeof(LookupApplication), "la")
// requires navigation path from SecurityGroup to LookupApplication
.CreateCriteria("la.SecurityGroup", "sg")
.CreateAlias("Members", "u")
.CreateAlias("Application", "al")
.Add(Restrictions.Eq("u.Id", user.Id))
.List<LookupApplication>()
Или использовать HQL , который имеет некоторые функции, недоступные в Criteria, items
получает все элементы из коллекции:
select sg.LookupApplications.items
from SecurityGroup sg inner join sg.Members u
where u.Id = :userId
HQL действительно рекомендуется, когда у вас нет динамических запросов.
Обновление , из комментария isuruceanu:
Session
.CreateQuery(
@"select sg.Application
from SecurityGroup sg
inner join sg.Members u
where u.Id = :userId")
.SetParameter("userId", user.Id)
.List<LookupApplication>();