2010-01-13 10 views
6

Tengo una tabla GL que contiene GLCode. Necesito obtener una lista de GLCodes únicos, pero obtener todas las otras columnas. El siguiente SQL produce los resultados que quiero.NHibernate: Obtenga resultados distintos basados ​​en una columna, pero recupere todas las columnas

select * from GL where GLId in (select Min(GLId) from GL group by GLCode) 

¿Hay alguna manera de hacerlo con la API de Criteria?

Ésta es mi mejor intento:

 var subQuery = DetachedCriteria.For<GL>(); 
     subQuery 
      .SetProjection(Projections.Property("GLCode"))     
      .SetResultTransformer(new DistinctRootEntityResultTransformer()); 

     return (List<GL>)currentSession 
      .CreateCriteria(typeof(GL)) 
      .Add(Subqueries.PropertyIn("GLCode", subQuery)) 
      .List<GL>(); 
+0

estoy también enfrenta el mismo problema. ¿Alguna ayuda? – Bipul

Respuesta

3

A pesar de que NHibernate no tiene una forma de excluir GLCode de las columnas del resultado de la subconsulta, todavía es posible crear una consulta que hace el trabajo. Use una subconsulta EXISTS correlacionada en lugar de IN. El SQL Nuestro objetivo es lograr es así:

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); 

Y aquí está la consulta 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>(); 
+0

Realmente me gusta el ejemplo sql antes de la respuesta nhibernate. – ctrlplusb

Cuestiones relacionadas