Linq rejoindre avec COUNT

c# entity-framework linq

Question

J'ai 2 tables, forums et messages.
Je souhaite récupérer tous les champs du forum avec un nouveau champ supplémentaire: compter tous les messages appartenant à ce forum.

J'ai ceci pour l'instant:

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. La jointure doit être gauche Rejoindre: s'il n'y a pas de message appartenant à un forum, les champs du forum doivent être récupérés mais le champ PostCount doit être 0
  2. Le résultat doit être distinct (join me donne la croix complète ... ou comment on l'appelle)

Réponse acceptée

Je pense que tu veux quelque chose comme:

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

Ou (comme indiqué dans les commentaires), vous pouvez poser une condition à l'appel de Count - j'oublie toujours qu'il est disponible :)

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

Une autre alternative pour filtrer uniquement les posts "affichés" serait de le faire dans la jointure:

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

Je crois que tout cela est logiquement correct, mais je ne sais pas à quoi ressemblera le code SQL ...


Réponse populaire

Si vous connectez des forums à des publications dans le concepteur linqtosql, cela créera une propriété de relation pouvant être interrogée.

var query = 
  from f in db.Forums
  select new
  {
    forum = f,
    PostCount = f.Posts.Count(p => p.ShowIt == 1)
  };


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow