2010-12-03 6 views
2

Wie würden Sie genau diese SQL-Abfrage mit dem neuen Linq to NHibernate Provider (3.x)Count Distinct - Inner Join - Gruppe von/Mit dem neuen Linq to NHibernate Provider

SELECT Post.Title, COUNT(DISTINCT Comment.UserId) 
FROM Post 
INNER JOIN Comment ON Post.Id = Comment.PostId 
GROUP BY Post.Title 
schreiben

Hier einige SQL, wenn Sie einige Tests

DECLARE @Post Table(Id int identity(1,1), Title varchar(200)) 
DECLARE @Comment Table(Id int identity(1,1), PostId int, Comment varchar(200), UserId int) 

DECLARE @PostId int 

INSERT INTO @Post(Title) 
VALUES ('Test') 

SELECT @PostId = SCOPE_IDENTITY() 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment', 1) 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment 2', 1) 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment 3', 2) 

INSERT INTO @Post(Title) 
VALUES ('Test 2') 

SELECT @PostId = SCOPE_IDENTITY() 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment', 1) 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment 2', 2) 

INSERT INTO @Comment(PostId, Comment, UserId) 
VALUES (@PostId, 'Test Comment 3', 3) 


SELECT Post.Title, COUNT(DISTINCT Comment.UserId) 
FROM @Post Post 
INNER JOIN @Comment Comment ON Post.Id = Comment.PostId 
GROUP BY Post.Title 
+0

Wie weit bist du gekommen? StackOverflow hilft Ihnen bei Problemen, nicht für Ihre Arbeit. Nichts für ungut, aber ein bisschen mehr Kontext würde in diesem Fall helfen;) –

+0

Angesichts der Tatsache, dass die Frage sehr einfach ist und dass ich mir die Zeit genommen habe, um den gesamten SQL zu produzieren, denke ich, diese Frage verdient diese Art von Kommentar nicht. Ich habe gerade angefangen, NHibernate zu benutzen und ich weiß nicht einmal, wo ich anfangen soll. Ich dachte, diese Frage wäre für jeden NHibernate-Guru einfach ... – W3Max

+0

Sie könnten versuchen, auf der nhusers-Gruppe http://groups.google.com/group/nhusers zu veröffentlichen, welche Version von nh verwenden Sie? –

Antwort

2

glaube ich nicht machen wollen, ist es derzeit möglich, den count(distinct x) Teil zu tun.

Dies ist der nächstgelegene ich bekam:

from comment in session.Query<Comment>() 
group comment by comment.Post.Title 
     into g 
     select new 
      { 
       Title = g.Key, 
       Count = g.Select(x => x.UserId).Distinct().Count() 
      }; 

Aber es produziert genau die gleiche SQL wie:

from comment in session.Query<Comment>() 
group comment by comment.Post.Title 
     into g 
     select new 
      { 
       Title = g.Key, 
       Count = g.Count() 
      }; 

Welche ist:

SELECT Post.Title, COUNT(*) 
FROM Comment 
LEFT JOIN Post ON Post.Id = Comment.PostId 
GROUP BY Post.Title 

Sie ein Problem hinterlassen sollte http://jira.nhforge.org. Es gibt eine Menge Arbeit mit dem Linq-Anbieter und es gibt eine gute Chance, dieses Konstrukt in naher Zukunft unterstützt zu bekommen.

+0

Vielen Dank für Ihre Antwort! Nach einigen Versuchen kam ich zu demselben Ergebnis. Schlimmer noch, das war ein vereinfachtes Beispiel für das Problem, vor dem ich stehe. Ich werde eine neue Frage mit der vollständigen Abfrage starten und nach dem besten Weg fragen (nicht nur nach Linq-To-NHibernate), es mit NHibernate zu machen. – W3Max

+0

Hier ist die neue Frage: http://stackoverflow.com/questions/4351683/how-can-i-do-this-query-with-nibernate – W3Max