2011-02-16 68 views
8

我在我的数据库模式中有几个父>子>孙子关系。通常,我有父母,我想了解一些关于孙子女的信息。例如,我有一个拥有一组社交网络的用户,他们拥有好友的集合。我发现自己一遍又一遍地写这些代码。如何从父母使用LINQ检索孙子对象

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

linq有没有更好的方法来做到这一点?

我真的很想能够做的是“user.Friends”,但我必须在朋友表中放置一个外键给用户,而且这种味道并不正确。这是什么样子:

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

想法?

回答

13

可以作为一种方法只编写一次代码的User类:

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

或者,你可以用SelectMany()

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

SelectMany!?!谁会想到? :) 谢谢! – DanielEli 2011-02-17 00:14:57

0

我知道这老了,但我已经最近面临着同样的问题,另一种选择是以相反的方式去做。而不是从用户开始并向下钻取,从朋友开始并根据父母(或祖父母)过滤。你需要这个用户的ID。当层次更深时,我觉得这个更清晰。例如:

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