我有几个父母>孩子>我的数据库模式中的孙子关系。通常,我有父母,我想要一些关于孙子的信息。例如,我的用户拥有一组社交网络,其中包含朋友的集合。我发现自己一遍又一遍地写这段代码。
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, ... }
思想?
答案 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();