我很新于使用LINQ,并遇到了一个似乎无法解决的问题。
所以,我基本上需要过滤嵌套在三个列表中的对象属性。 数据(作为JSON)如下所示:
我会尽力用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找到一种优雅、干净的方法来解决这个问题,如有帮助不胜感激!
.Where
并不会改变项本身,它只影响从根集合中返回哪些项。您可以通过LINQ的.Select()
方法返回与原始项不同的内容,但如果想要更改对象,则可能需要进行深度克隆 并更改resourceTypeUserVms
属性。实际上,这需要分别处理这些任务的方法,并在LINQ中调用这些方法。 - asontu