2011-02-16 13 views
8

Tengo varias relaciones principales> hijo> nieto en mi esquema db. Normalmente, tengo el padre y quiero información sobre los nietos. Por ejemplo, tengo un usuario que tiene una colección de redes sociales que tienen colecciones de amigos. Me encuentro escribiendo este código una y otra vez.Cómo recuperar objetos de nieto de un padre utilizando linq

 var friends = new List<Friend>(); 
     foreach (var socialNetwork in user.UserSocialNetworks) 
     { 
      foreach (var friend in socialNetwork.Friends) 
      { 
       friends.Add(friend); 
      } 
     } 

¿Hay una forma más elegante de hacer esto con linq?

Lo que realmente me gustaría poder hacer es "user.Friends" pero tendré que poner una clave foránea al usuario en la mesa de amigos y eso no huele bien. Esto es lo que se vería así:

User   {Id,..} 
SocialNetwork {Id, UserId, ...} 
Friend  {Id, SocialNetworkId, UserId, ... } 

¿Pensamientos?

Respuesta

13

Puede escribir el código sólo una vez como un método en la clase User:

partial class User 
{ 
    public IEnumerable<Friend> Friends() 
    { 
    return from socialNetwork in this.UserSocialNetworks 
      from friend in socialNetwork.Friends 
      select friend; 
    } 
} 

Alternativamente, puede simplemente utilizar SelectMany():

var friends = user.UserSocialNetworks.SelectMany(socialNtwk=>socialNtwk.Friends); 
+2

¡SeleccioneMany!?! ¿Quién hubiera pensado? :) ¡Gracias! – DanielEli

0

Sé que este viejo, pero no tengo recientemente se enfrentó a lo mismo, y una alternativa es hacerlo de la manera opuesta. En lugar de comenzar en usuario y profundizar, comience en Friend y filtre según el padre (o abuelo). Necesitarías la identificación del usuario para esto. Cuando la jerarquía se vuelve más profunda, encuentro esto más legible. Algo como:

return _db<your entities>.Friend 
    .Where(f => f.SocialNetwork.User.Id == userId) 
    .ToList(); 
Cuestiones relacionadas