gpt4 book ai didi

c# - LINQ 按嵌套在 3 个列表中的属性筛选

转载 作者:行者123 更新时间:2023-12-04 08:21:04 26 4
gpt4 key购买 nike

我是 LINQ 的新手,遇到了一个我似乎无法解决的问题。

所以我基本上需要过滤嵌套在三个列表中的对象的属性。数据(作为 JSON)如下所示:

  [
{
"userName":"John",
"resourceTypeUserVms":[
{
"name":"Administration",
"description":null,
"resourceUserVms":[
{
"policyUserVm":{
"policyName":"admin",
"priority":0,
"metaHash":"abc123",
"policySetName":"Admin",
"policySetDescription":""
},
"accessType":"Administration",
"accessDescription":null,
"metaData":"{\"Name\":\"Admin\"}"
},
{
"policyUserVm":{
"policyName":"test",
"priority":0,
"metaHash":"abc123",
"policySetName":"Test",
"policySetDescription":""
},
"accessType":"Administration",
"accessDescription":null,
"metaData":"{\"Name\":\"test123\"}"
}
]
},
{
"name":"Database",
"description":null,
"resourceUserVms":[
{
"policyUserVm":{
"policyName":"read_x",
"priority":0,
"metaHash":"def456",
"policySetName":"Test",
"policySetDescription":""
},
"accessType":"read",
"accessDescription":null,
"metaData":"{\"Server\":\"srv\",\"Name\":\"test\"}"
}
]
},
{
"name":"Configuration",
"description":null,
"resourceUserVms":[
{
"policyUserVm":{
"policyName":"readc",
"priority":0,
"metaHash":"ghi789",
"policySetName":"Configurations",
"policySetDescription":""
},
"accessType":"read",
"accessDescription":null,
"metaData":"{\"Name\":\"ServiceName\"}"
}
]
}
]
}
]

所以我基本上有一个用户有 x 个 ResourceTypesUserVms,那些 ResourceTypes 有 x 个 ResourceUserVms。

我需要过滤 ResourceUserVms 内的属性“metaData”。因此,例如,如果在过滤栏中输入“Admin”,我想得到这样的返回:

[
{
"userName":"John",
"resourceTypeUserVms":[
{
"name":"Administration",
"description":null,
"resourceUserVms":[
{
"policyUserVm":{
"policyName":"admin",
"priority":0,
"metaHash":"abc123",
"policySetName":"Admin",
"policySetDescription":""
},
"accessType":"Administration",
"accessDescription":null,
"metaData":"{\"Name\":\"Admin\"}"
}
]
}
]
}
]

我在网上找到了一些建议我这样做的解决方案:

filteredUsers = users
.Where(x => x.ResourceTypeUserVms
.Any(x => x.ResourceUserVms
.Any(x => x.MetaData.ToLower().Contains(value))))
.ToList();

但是,这并没有产生我想要的结果。

我通过这样做得到了预期的结果(前面的代码不干净):

foreach(var user in users)
{
foreach(var resourceType in user.ResourceTypeUserVms)
{
foreach(var resource in resourceType.ResourceUserVms)
{
if (resource.MetaData.ToLower().Contains(value))
{
filteredUsersTemp.Add(
new UserUserVm
{
UserName = user.UserName,
ResourceTypeUserVms = new List<ResourceTypeUserVm>(
new ResourceTypeUserVm[] {
new ResourceTypeUserVm
{
Description = resourceType.Description,
Name = resourceType.Name,
ResourceUserVms = new List<ResourceUserVm>(
new ResourceUserVm[]{ resource }
)
}
})
}
);
}
}
}
}

如果有人可以帮助我找到一种使用 LINQ 执行此操作的简洁明了的方法,我将不胜感激!

最佳答案

我想,您还需要按 MetaData 过滤 ResourceUserVms。

因此,首先,获取所有具有 ResourceTypeUserVms 且具有 ResourceUserVms 且具有 MetaData (==value) 的用户。你真的做到了。

然后你就可以摆脱无用的元数据 ResourceUserVms。

   filteredUsers = users
.Where(x => x.ResourceTypeUserVms
.Any(x => x.ResourceUserVms
.Any(x => x.MetaData.ToLower().Contains(value))))
.ToList();

filteredUsers = filteredUsers.Select(x=>{

x.ResourceTypeUserVms = x.ResourceTypeUserVms.Select(y=> {

y.ResourceUserVms = y.ResourceUserVms.Where(s=>s.MetaData.ToLower().Contains(value)))).ToList();

return y;

}).ToList();

return x;

}).ToList();

关于c# - LINQ 按嵌套在 3 个列表中的属性筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65498835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com