1

我对返回结果的数据库进行了查询,并且我有一个 IEnumerable 包含另一个 IEnumerable 并且在 Model Populator 中我做了类似的事情

List<Parent> parents = Result1;
List<Children> children = Result2;

进而

foreach (parent p in parents)
{
 p.MyChildren = children.Where(x => x.ParentId == p.Id);
}

到目前为止,我已经进行了调试,并且当我在循环期间以及在包含模型的最终模型中返回模型时,数据都是正确的。

然而,在控制器上,我得到了一个父母列表,他们都有相同的孩子集合,即使他们之前是正确的。这意味着每个父母在“MyChildren”中都有相同的随机集合,而不是属于他们的集合。

我的视图模型在任何地方都没有静态变量,也没有从模型到控制器的其他对象操作。

参考资料真的很奇怪,我不知道如何解决它。有任何想法吗?

4

1 回答 1

3

在设置子项时尝试添加ToList()到右侧:

foreach (parent p in parents)
{
    var id = p.Id;
    parent.MyChildren = children.Where(x => x.ParentId == id).ToArray();
}

的结果WhereIEnumerable,并且项目的实际检索被延迟。这意味着如果以后发生变化,parent.MyChildren就会发生变化。添加ToArray()强制枚举立即发生。

根据Servy的评论更新

您还必须创建(在上面更新)的本地(在foreach块内)副本。p.Id这个问题被称为“访问修改的闭包”更多信息:例如。 另请参阅此处了解更多背景信息,包括 Eric Lippert 的回答,他将修改后的闭包描述为C# 中最糟糕的“陷阱”之一

于 2012-12-06T19:08:33.303 回答