如何使用linq从父级检索孙子对象

时间:2011-02-16 22:26:50

标签: .net linq database-design

我有几个父母>孩子>我的数据库模式中的孙子关系。通常,我有父母,我想要一些关于孙子的信息。例如,我的用户拥有一组社交网络,其中包含朋友的集合。我发现自己一遍又一遍地写这段代码。

        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, ... }

思想?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我知道这很古老,但我最近遇到了同样的事情,另一种选择是以相反的方式去做。不是从用户开始向下钻取,而是从朋友开始并根据父(或祖父母)过滤。您需要用户的ID。当层次结构变得更深时,我发现它更清晰。类似的东西:

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