使用 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;
}
这应该有效:
foreach (SuperHeroModel superHero in superHeros)
{
IEnumerable<int> powerIds = superHero.Powers.Select(p => p.PowerId);
superHeros.Powers = powers.Where(p => powerIds.Contains(p.PowerId));
}