2010-01-13 2 views
6

Ich habe eine Tabelle GL, die GLCode enthält. Ich brauche eine Liste der einzigartigen GLCodes, aber alle anderen Spalten. Das folgende SQL erzeugt die gewünschten Ergebnisse.NHibernate: Erhalten Sie eindeutige Ergebnisse basierend auf einer Spalte, aber alle Spalten abrufen

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

Gibt es eine Möglichkeit, dies mithilfe der Kriterien-API zu tun?

Dies ist mein bester Versuch:

 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

ich auch das gleiche Problem konfrontiert bin. Irgendeine Hilfe? – Bipul

Antwort

3

Obwohl NHibernate keine Möglichkeit hat GLCode aus der Unterabfrage der Ergebnisspalten auszuschließen, ist es immer noch möglich, eine Abfrage zu erstellen, die die Arbeit erledigt. Verwenden Sie eine korrelierte EXISTS-Unterabfrage anstelle von IN. Die SQL für die wir schießen ist wie folgt:

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

Und hier ist die NHibernate-Abfrage:

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

Wirklich wie das SQL-Beispiel vor der Nhibernate Antwort. – ctrlplusb