2010-12-03 6 views
2

Comment voulez-vous écrire cette exacte requête SQL avec la nouvelle Linq à NHibernate Fournisseur (3.x)Count Distinct - Inner Join - Groupe Par/Avec la nouvelle LINQ to NHibernate Fournisseur

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

Voici quelques SQL si vous voulez faire des 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

Jusqu'où êtes-vous allé? StackOverflow est pour aider avec des problèmes, pas pour faire votre travail. Sans vouloir offenser, mais un peu plus de contexte aiderait dans ce cas;) –

+0

Étant donné que la question est très simple et que j'ai pris le temps de produire tout le SQL, je pense que cette question ne mérite pas ce genre de commentaire. Je viens de commencer à utiliser NHibernate et je ne sais même pas par où commencer. Je pensais que cette question serait facile pour n'importe quel gourou NHibernate ... – W3Max

+0

Vous pourriez essayer de poster sur le groupe nhusers http://groups.google.com/group/nhusers quelle version de nh utilisez-vous? –

Répondre

2

Je ne pense pas qu'il est actuellement possible de faire la partie count(distinct x).

C'est le plus proche je suis arrivé:

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

Mais il produit exactement le même SQL que:

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

qui est:

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

Vous devez envoyer une question à http://jira.nhforge.org. Il y a beaucoup de travail en cours avec le fournisseur de Linq et il y a de bonnes chances que cette construction soit supportée dans un proche avenir.

+0

Merci pour votre réponse! Après quelques tentatives je suis arrivé à la même conclusion. Pire encore, c'était un exemple simplifié du problème auquel je suis confronté. Je vais commencer une nouvelle question avec la requête complète et demander le meilleur moyen (pas seulement Linq-To-NHibernate) de le faire avec NHibernate. – W3Max

+0

Voici la nouvelle question: http://stackoverflow.com/questions/4351683/how-can-i-do-this-query-with-nhibernate – W3Max