Linq присоединиться к COUNT - PullRequest
10 голосов
/ 04 мая 2010

У меня есть 2 таблицы, форумы и сообщения.
Я хочу получить все поля форумов с новым дополнительным полем: подсчитать все сообщения, принадлежащие этому форуму.

У меня есть это сейчас:

var v =(from forum in Forums
    join post in Posts on forum.ForumID equals post.Forum.ForumID 
    select new 
    {
        forum, //Need to retrieve all fields/columns from forum     
        PostCount = //count all post that belong to this forum with a condition: count it only if post.Showit==1

    }
    ).Distinct()
  1. Присоединение должно быть левым: если нет сообщения, относящегося к какому-либо форуму, поля форума должны быть получены, но поле PostCount должно быть 0.
  2. Результирующий набор должен быть отличным (соединение дает мне полный крестик ... или как это называется)

Ответы [ 2 ]

20 голосов
/ 04 мая 2010

Я думаю, вы хотите что-то вроде:

from forum in Forums
// ForumID part removed from both sides: LINQ should do that for you.
// Added "into postsInForum" to get a group join
join post in Posts on forum equals post.Forum into postsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = postsInForum.Where(post => post.ShowIt == 1).Count()
}

Или (как указано в комментариях) вы можете поместить условие в вызов Count - я всегда забываю, что доступно:)

from forum in Forums
// ForumID part removed from both sides: LINQ should do that for you.
// Added "into postsInForum" to get a group join
join post in Posts on forum equals post.Forum into postsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = postsInForum.Count(post => post.ShowIt == 1)
}

Еще одна альтернатива для фильтрации только "показанных" постов - сделать это в объединении:

from forum in Forums
join post in Posts.Where(post => post.ShowIt == 1)
    on forum equals post.Forum into shownPostsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = shownPostsInForum.Count()
}

Я считаю, что все это логически правильно, но я не знаю, как будет выглядеть SQL ...

4 голосов
/ 04 мая 2010

Если вы подключите Форумы к сообщениям в конструкторе linqtosql, это создаст свойство отношения, к которому можно обратиться.

var query = 
  from f in db.Forums
  select new
  {
    forum = f,
    PostCount = f.Posts.Count(p => p.ShowIt == 1)
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...