使用 LINQ 将平面列表合并到层次结构中

本文关键字:层次结构 合并 列表 LINQ 平面 使用 | 更新日期: 2023-09-27 18:34:51

// simple EF projection (anonymous type returned)
var superHerosData = from hero in filteredHeros 
                     select new
                     {
                        hero.HeroId,
                        hero.FirstName
                        hero.LastName
                        Powers = from power in hero.Powers
                                 select new
                                 {
                                    power.PowerId;
                                 }
                    };
List<SuperHeroModel> superHeros = new List<SuperHeroModel>();
// populates superHeros (collection of SuperHeroModel) with the values in superHerosData
MapToModel(superHerosData, ref superHeros)
IQueryable<DAL.Models.Power> powersData = from hero in filteredHeros
                                          from power in hero.Powers
                                          select power;

获得电源是昂贵的,如果在单个操作中完成,则性能更好(平面收集(

List<PowerModel> powers = await GetPowers(powersData);

我需要将每个超级英雄模型(超级英雄集合(中的 Powers 集合替换为 power 集合中的匹配模型集合。

将扁平的权力列表注入超级英雄层次结构的好方法是什么? SuperHeroModel.Powers当前包含仅填充 PowerId 的PowerModel集合

更新:

这样的东西可能会起作用,但感觉不是很友好。我希望有一个更优雅的解决方案:

foreach (SuperHeroModel superHero in superHeros)
{
    IEnumerable<int> superHeroPowerIds = superHero.Powers.Select(p => p.PowerId);
    List<PowerModel> superHeroPowers = powers.Where(power => superHeroPowerIds.Contains(power.PowerId)).ToList();
    superHero.Powers = superHeroPowers;
}

使用 LINQ 将平面列表合并到层次结构中

这应该有效:

foreach (SuperHeroModel superHero in superHeros)
{
    IEnumerable<int> powerIds = superHero.Powers.Select(p => p.PowerId);
    superHeros.Powers = powers.Where(p => powerIds.Contains(p.PowerId));
}