2010-10-27 5 views
1

J'ai besoin d'effectuer une agrégation de regroupement similaire à quelque chose comme ceci dans T-SQL:Pouvez-vous effectuer des opérations agrégées complexes en utilisant NH3?

select b.Name as [Grouped Name], 
COUNT(distinct a.ID) as [Grouped Count], 
COUNT(distinct c1.ID) as [Second Group Count], 
COUNT(distinct c2.ID) as [Third Group Count] 
from TableA a 
left join TableB b on a.ID = b.TableAID 
left join TableC c1 on a.ID = c1.TableAID and c1.SomeCondition = 1 
left join TableC c2 on a.ID = c2.TableAID and c2.SomeCondition = 2 
group by b.Name 
order by b.Name 

J'ai fait un certain nombre de tentatives d'essayer de construire un modèle d'objet et la carte à l'aide de NH3, puis construire une requête qui va construire cette syntaxe SQL, mais j'ai eu peu de succès.

Est-ce quelque chose qui est possible de faire en utilisant NH3? Si oui, y a-t-il un moyen de le faire dans LINQ? ou API Criteria? ou HQL?

À ce stade, je suis ouvert à tout. J'ai juste besoin d'être pointé dans la bonne direction parce que tous les trous de lapin que j'ai abattus jusqu'ici ne m'ont pas conduit nulle part.

LINQ J'ai essayé jusqu'à présent est la suivante:

//act 
var query = from a in session.Query<TableA>() 
    orderby a.TableB.Name 
    select 
     new 
     { 
      Grouped Name = a.TableB.Name, 
      GroupedCount = a.Count(), 
      SecondGroupCount = a.TableC.Count(c => c.SomeCondition == 1), 
      ThirdGroupCount = a.TableC.Count(c => c.SomeCondition == 2), 
     }; 

var results1 = query.ToList(); 

J'ai aussi essayé avec un groupe en mais peu importe ce que je fais, NH3 lève toujours une exception si je me réfère à TableC dans plus de un agrégat. Si je l'ai seulement avec un agrégat, la requête s'exécute. Si j'essaye de le faire avec deux agrégats, j'obtiens une exception.

Répondre

1

HQL est probablement le chemin à parcourir. Linq est trop perméable, les critères sont trop verbeux.

Quelque chose le long des lignes de:

select b.Name as [Grouped Name], 
COUNT(distinct a.id) as [Grouped Count], 
COUNT(distinct c1.id) as [Second Group Count], 
COUNT(distinct c2.id) as [Third Group Count] 
from TableA a 
left join a.TableB b 
left join a.TableC c1 with c1.SomeCondition = 1 
left join a.TableC c2 with c2.SomeCondition = 2 
group by b.Name 
order by b.Name 

Ce qui est presque le même que votre SQL, avec quelques réglages mineurs dans les jointures. Je ne suis pas complètement sûr si la jointure double à TableC fonctionnera, mais il ne fait pas mal d'essayer.

Dans tous les cas, si le SQL fonctionne, vous n'avez pas besoin d'arrêter de l'utiliser ... CreateSQLQuery fonctionnera toujours.

Questions connexes