2010-01-13 11 views
6

GLCode içeren bir tablo GL'ye sahibim. Eşsiz GLCod'ların bir listesini almam gerek ama diğer tüm sütunları al. Aşağıdaki SQL, istediğim sonuçları üretir.NHibernate: Bir sütuna göre farklı sonuçlar elde edin, ancak tüm sütunları alın

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

Kriterler API'sini kullanarak bunu yapmanın bir yolu var mı?

Bu benim en iyi girişimi: NHibernate alt sorgu en sonuç sütunlarından GLCode dışlamak için bir yol yoktur rağmen

 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

. Herhangi bir yardım? – Bipul

cevap

3

, işi yapan bir sorgu oluşturmak için yine de mümkündür. IN yerine ilişkilendirilmiş bir EXISTS alt sorgu kullanın.

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

Ve burada NHibernate sorgu var: biz çekiyoruz SQL böyledir ben de aynı sorunla karşı karşıya am

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

Gerçekten nhibernate cevabı öncesi sql örneği gibi. – ctrlplusb