C# asp.net c linq搜索列表树
我有一个包含子对象的对象,我需要在其中一个子对象中搜索特定ID 对象树类似于:C# asp.net c linq搜索列表树,c#,asp.net,linq,C#,Asp.net,Linq,我有一个包含子对象的对象,我需要在其中一个子对象中搜索特定ID 对象树类似于: Sites (id, name) ->Zones[] (id, name) -->Placements[] (id, name) 我把它存储在一个包含多个站点的列表中,每个站点可以有多个区域和多个位置 我试图寻找两件事: 放置[]。id=放置id 分区[]。id=分区id 每个搜索结果对象还应该包含父对象的信息,因此我也可以引用它 我正在努力: List<SitesList>
Sites (id, name)
->Zones[] (id, name)
-->Placements[] (id, name)
我把它存储在一个包含多个站点的列表中,每个站点可以有多个区域和多个位置
我试图寻找两件事:
放置[]。id=放置id
分区[]。id=分区id
每个搜索结果对象还应该包含父对象的信息,因此我也可以引用它
我正在努力:
List<SitesList> sitesTree = getSites();
var searchresults = sitesTree.Find(zones => zones.zones[0].id == zoneId);
if(searchresults != null)
{
details.siteName = searchresults.name;
details.siteId = searchresults.id;
details.zoneName = searchresults.zones[0].name;
details.zoneId = searchresults.zones[0].id;
}
您还只检查分区数组中的第一个分区的id是否设置为zoneid。你打算只搜索第一个孩子吗?Tf不使用:
var searchresults = sitesTree.Find(zones => zones.zones.Any(z=>z.id == zoneId));
这将在sitesTree列表中找到至少有一个子项具有区域id的任何条目。您可以使用SelectMany将数据结构展平,并将其选择为匿名类型。这将为您提供对象上的父站点和分区,以便您可以使用它们,例如:
var results = sites.SelectMany(s => s.Zones.Select(z => new {ParentSite = s, Zone = z}))
.SelectMany(x => x.Zone.Placements.Select(p => new {ParentSite = x.ParentSite,
ParentZone = x.Zone,
Placement = p}))
.Where(x => x.Placement.Id == 2 && x.ParentZone.Id == zoneId)
.ToList();
然后生成的匿名结构将如下所示:
{ParentSite: Site, ParentZone: Zone, Placement: Placement}
因此,您可以从placement属性中引用放置,从ParentZone属性中引用父区域,从ParentSite属性中引用父站点。在访问区域[0]之前,请检查区域是否为空
{ParentSite: Site, ParentZone: Zone, Placement: Placement}