我有一个方法可以将子集合映射到父集合中的适当父级
public static void ApplyParentChild<TParent, TChild, TId>(
this IEnumerable<TParent> parents, IEnumerable<TChild> children,
Func<TParent, TId> id, Func<TChild, TId> parentId,
Action<TParent, TChild> action
)
{
var lookup = parents.ToDictionary(id);
foreach (var child in children)
{
TParent parent;
if (lookup.TryGetValue(parentId(child), out parent))
action(parent, child);
}
}
&amp;如果我按下面的方法调用该方法(项目中包含相位列表),这就开始了。
projects.ApplyParentChild(phases, p => p.ProjectId, c => c.ProjectId, (p, c) => p.ProjectPhases.Add(c));
但我常常遇到一个情况,即我有一个阶段有项目参考。所以我把它称之为
phases.ApplyParentChild(projects, p => p.ProjectId, c => c.ProjectId, (p, c) => p.project=c);
这失败了。这是因为parents.ToDictionary(id)
无法获取唯一标识符并将错误返回为“已添加具有相同键的项目。”
我该如何处理这个问题?我不是一个linq大师。任何人都可以帮助我吗?
答案 0 :(得分:1)
由于Project
与Phases
有一对多关系,因此您必须始终使用Project
作为父级。只需更改操作:
projects.ApplyParentChild(
phases,
p => p.ProjectId,
c => c.ProjectId,
(p, c) => c.project = p);
答案 1 :(得分:0)
您可以使用linq join重新解决您的问题:
var joinedData = parents
.Join(
children,
parent => parent.SomeId, //id Func
child => child.SomeId, //parentId Func
(parent, child) => new{parent, child});
foreach(var x in joinedData)
{
action(x.parent, x.child);
}