如何让所有 child 达到特定级别,如 4X15 级别矩阵
How to get all child to specific levels like 4X15 level matrix
我有 4X15 这样的矩阵,我想找到 child 最多 15 个级别。就像我发送 parent id 2 那么它应该 return 从级别 1 到接下来的 15 个级别的所有 4 条记录
ID Name ParentId
1 A 0
2 B 1
3 C 1
4 D 2
5 E 2
6 F 1
7 G 1
8 H 3
9 I 4
10 J 5
11 K 3
. . .
. . .
100 XX 9
101 XA 10
. . .
. . .
因此,对于用户 2,它应该 return 最多 15 个级别的所有记录。
2 => (4,5,9,10,100,101) Level1 (4,5) Level2(9), Level3(10), Level4(100), Level5(101)
有什么方法可以在 LINQ 中找到它吗?
我用 LINQ 和递归函数得到了它的解决方案
public List<MyNetworkModel> FetchUserNetworkData(int userId)
{
List<MyNetworkModel> userNetwork = new List<MyNetworkModel>();
int counter = 1;
List<MyNetworkModel> level1 = (from t in _ctx.Users
where t.ParentId == userId
select new MyNetworkModel
{
Id = t.Id,
ParentId = t.ParentId,
SponsorId = t.SponsorId,
Fullname = t.Fullname,
DateOfJoining = t.DateOfJoining,
PhoneNumber = t.PhoneNumber,
IsTccReceived = t.IsTccReceived ? "Yes" : "No",
TccWalletAddress = t.TccWalletAddress,
Rank = t.Rank,
Level = 1
}).ToList();
AddUsers(ref userNetwork, level1, counter);
return userNetwork;
}
private List<MyNetworkModel> AddUsers(ref List<MyNetworkModel> nestedUsers, List<MyNetworkModel> level, int counter)
{
foreach (var user in level)
{
nestedUsers.Add(user);
GetChildren(user.Id, ref nestedUsers, counter);
}
return nestedUsers;
}
private void GetChildren(int userId, ref List<MyNetworkModel> nestedUsers, int counter)
{
counter++;
List<MyNetworkModel> nthLevel = (from t in _ctx.Users
where t.ParentId == userId
select new MyNetworkModel
{
Id = t.Id,
ParentId = t.ParentId,
SponsorId = t.SponsorId,
Fullname = t.Fullname,
DateOfJoining = t.DateOfJoining,
PhoneNumber = t.PhoneNumber,
IsTccReceived = t.IsTccReceived ? "Yes" : "No",
TccWalletAddress = t.TccWalletAddress,
Rank = t.Rank,
Level = counter
}).ToList();
if (nthLevel != null && nthLevel.Any() && counter <= 15)
{
AddUsers(ref nestedUsers, nthLevel, counter);
}
}
现在只需调用 FetchUserNetworkData(1);
这将 return 最多 15 个级别的数据,并列出有多少用户处于哪个级别。
我有 4X15 这样的矩阵,我想找到 child 最多 15 个级别。就像我发送 parent id 2 那么它应该 return 从级别 1 到接下来的 15 个级别的所有 4 条记录
ID Name ParentId
1 A 0
2 B 1
3 C 1
4 D 2
5 E 2
6 F 1
7 G 1
8 H 3
9 I 4
10 J 5
11 K 3
. . .
. . .
100 XX 9
101 XA 10
. . .
. . .
因此,对于用户 2,它应该 return 最多 15 个级别的所有记录。 2 => (4,5,9,10,100,101) Level1 (4,5) Level2(9), Level3(10), Level4(100), Level5(101)
有什么方法可以在 LINQ 中找到它吗?
我用 LINQ 和递归函数得到了它的解决方案
public List<MyNetworkModel> FetchUserNetworkData(int userId)
{
List<MyNetworkModel> userNetwork = new List<MyNetworkModel>();
int counter = 1;
List<MyNetworkModel> level1 = (from t in _ctx.Users
where t.ParentId == userId
select new MyNetworkModel
{
Id = t.Id,
ParentId = t.ParentId,
SponsorId = t.SponsorId,
Fullname = t.Fullname,
DateOfJoining = t.DateOfJoining,
PhoneNumber = t.PhoneNumber,
IsTccReceived = t.IsTccReceived ? "Yes" : "No",
TccWalletAddress = t.TccWalletAddress,
Rank = t.Rank,
Level = 1
}).ToList();
AddUsers(ref userNetwork, level1, counter);
return userNetwork;
}
private List<MyNetworkModel> AddUsers(ref List<MyNetworkModel> nestedUsers, List<MyNetworkModel> level, int counter)
{
foreach (var user in level)
{
nestedUsers.Add(user);
GetChildren(user.Id, ref nestedUsers, counter);
}
return nestedUsers;
}
private void GetChildren(int userId, ref List<MyNetworkModel> nestedUsers, int counter)
{
counter++;
List<MyNetworkModel> nthLevel = (from t in _ctx.Users
where t.ParentId == userId
select new MyNetworkModel
{
Id = t.Id,
ParentId = t.ParentId,
SponsorId = t.SponsorId,
Fullname = t.Fullname,
DateOfJoining = t.DateOfJoining,
PhoneNumber = t.PhoneNumber,
IsTccReceived = t.IsTccReceived ? "Yes" : "No",
TccWalletAddress = t.TccWalletAddress,
Rank = t.Rank,
Level = counter
}).ToList();
if (nthLevel != null && nthLevel.Any() && counter <= 15)
{
AddUsers(ref nestedUsers, nthLevel, counter);
}
}
现在只需调用 FetchUserNetworkData(1); 这将 return 最多 15 个级别的数据,并列出有多少用户处于哪个级别。