2010-05-04 19 views
8

Tengo 2 tablas, foros y publicaciones.
Quiero recuperar todos los campos de Foros con un nuevo campo adicional: cuente todas las publicaciones que pertenecen a este foro.Linq join with COUNT

tengo unas pocas cosas por ahora:

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 unión debe dejarse unirse: si no hay post que pertenece a algún foro, los campos foros deben ser recuperados pero el campo PostCount deben ser 0.
  2. el conjunto de resultados debe ser distinto (unirse a me da la cruz completo ... o cómo se llama)
+0

¿Alguien sabe si hay algo que pueda hacer en SQL Server para optimizar tales consultas? Tengo la misma situación pero necesito múltiples resultados de Count() –

Respuesta

16

creo que quieres algo como:

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

O (como se señala en los comentarios) que puede poner una condición en la llamada Count - Siempre se olvide que 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) 
} 

Otra alternativa para el filtrado de tan sólo "muestra" mensajes haría ser hacerlo en la unión:

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

creo que todos estos son lógicamente correcta, pero no sé lo que el SQL se verá así ...

+0

¿No puede hacer 'PostCount = g.Count (post => post.ShowIt == 1)'? ¿O solo para LinqToObject? – ANeves

+0

@sr pt: Sí, buen punto. Editará :) –

+0

¿Pueden explicar el uso de la palabra "en" it; s no se supone que se use con "grupo"? – shivesh

2

Si conecta Forums to Posts en el diseñador de linqtosql, esto creará una propiedad de relación que se puede consultar.

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