2010-12-03 1 views
2

Как бы вы написать этот точный SQL запрос с новым провайдером Linq-на-NHibernate (3.x)Count Distinct - внутреннее соединение - группы/С новым поставщиком Linq-на-NHibernate

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

Вот некоторые SQL, если вы хотите, чтобы сделать некоторые тесты

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

Как далеко вы попали? StackOverflow предназначен для решения проблем, а не для выполнения вашей работы. Не обижайтесь, но в этом случае поможет немного больше контекста;) – 2010-12-03 02:47:22

+0

Учитывая тот факт, что вопрос очень прост и что я нашел время для создания всего SQL, я думаю, что этот вопрос не заслуживает такого комментария. Я только начал использовать NHibernate, и я даже не знаю, с чего начать. Я думал, что этот вопрос будет легким для любого гуру NHibernate ... – W3Max 2010-12-03 03:00:51

ответ

2

Я не думаю, что это возможно в настоящее время, чтобы сделать count(distinct x) часть.

Это ближайший я получил:

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

Но он производит точно такой же SQL, как:

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

Что:

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

Вы должны опубликовать вопрос на http://jira.nhforge.org. Есть много работы с поставщиком Linq, и есть хороший шанс, чтобы эта конструкция была поддержана в ближайшем будущем.