Несмотря на то, что NHibernate не имеет возможности исключить GLCode из столбцов результатов подзапроса, все еще возможно создать запрос, который выполняет эту работу. Используйте коррелированный подзапрос EXISTS вместо IN. SQL, для которого мы стреляем, выглядит так:
select query.*
from GL query
where exists (
select
min(subquery.GLId) AS GLId,
subquery.GLCode
from GL subquery
group by subquery.GLCode
having min(subquery.GLId) = query.GLId);
А вот запрос NHibernate:
var min = Projections.Min("GLId");
var subquery = DetachedCriteria.For<GL>("subquery")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("GLCode"), "GLCode")
.Add(min, "GLId"))
.Add(Restrictions.EqProperty(min, "query.GLId"));
return session.CreateCriteria<GL>("query")
.Add(Subqueries.Exists(subquery))
.List<GL>();