2010-01-13 7 views
6

J'ai une table GL qui contient GLCode. Je dois obtenir une liste de GLCodes uniques, mais obtenir toutes les autres colonnes. Le SQL suivant produit les résultats que je veux.NHibernate: obtient des résultats distincts basés sur une colonne, mais récupère toutes les colonnes

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

Existe-t-il un moyen de le faire en utilisant l'API Criteria?

Ceci est ma meilleure tentative:

 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

Je suis confronté au même problème. De l'aide? – Bipul

Répondre

3

Même si NHibernate ne dispose pas d'un moyen d'exclure GLCode de colonnes de résultat de la sous-requête, il est encore possible de créer une requête qui fait le travail. Utilisez une sous-requête EXISTS corrélée au lieu de IN. Le SQL que nous filmons pour est comme ceci:

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

Et voici la requête 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

Vraiment comme l'exemple sql avant la réponse nhibernate. – ctrlplusb

Questions connexes