Dot-Net

如何使用 linq 從父級檢索孫對象

  • November 17, 2017

我的數據庫架構中有幾個父>子>孫關係。通常,我有父母,我想要一些關於孫子孫女的資訊。例如,我有一個使用者,他擁有一系列社交網路,其中有很多朋友。我發現自己一遍又一遍地編寫這段程式碼。

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

想法?

您可以只編寫一次程式碼作為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);

我知道這很老,但我最近也遇到了同樣的事情,另一種選擇是反其道而行之。不是從使用者開始向下鑽取,而是從朋友開始並根據父(或祖父母)過濾。為此,您需要使用者的 ID。當層次結構變得更深時,我發現這更清晰。就像是:

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

引用自:https://stackoverflow.com/questions/5022900