C# asp.net c linq搜索列表树

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>

我有一个包含子对象的对象,我需要在其中一个子对象中搜索特定ID

对象树类似于:

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}