Count Distinct - Inner Join - Группировка по / с новым провайдером Linq-NHibernate - PullRequest
2 голосов
/ 03 декабря 2010

Как бы вы написали этот точный запрос SQL с новым провайдером Linq-to-NHibernate (3.x)

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

1 Ответ

2 голосов
/ 03 декабря 2010

Я не думаю, что в настоящее время возможно выполнить часть 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 идет большая работа, и есть хороший шанс получить поддержку этой конструкции в ближайшем будущем.

...