从控制器接收模型(带有 IEnumerable 属性)时的奇怪行为

Bizarre behavior when receiving a Model (with a IEnumerable property) from controller

我遇到了一个奇怪的行为。 为简单起见,我在控制器中得到了这个方法

public async Task<IActionResult> IndexAsync()
{
   var user = await userManager.GetUserAsync(this.User);

   var userEvents = context.Events
       .Where(e => e.AppIdentityUserId == user.Id)
       .AsEnumerable();

   return View(userEvents);
}

和这个模型:

public class Event
{
    //other properties
    public IEnumerable<Participant> ParticipantsList { get; set; }
}

当我的视图接收到该模型时,ParticipantsList 为空。 所以我写了一个测试查询,观察发生了什么。

foreach (var event in userEvents)
    test = context.Participants.Where(p => p.EventId == event.Id).AsEnumerable();

查询成功检索到该信息

这就发生了

所以,这一次,我在foreach循环的每次迭代中都添加了一个断点,在每个断点中展开测试结果,除了最后一个

如您所见,只有在我展开相应的测试时才会填充。如果我在测试前展开事件结果,列表仍然为空。

我想了解为什么会发生这种情况,以便我可以在将来解决此问题和任何相关问题。

我希望我能弄清楚发生了什么。事实证明,正确地做到这一点是一个挑战。

IEnumerable<T> 被延迟评估。如果没有迭代它,IEnumerable<T> 的实现不会执行。

通过评估调试器中的值,您可以使该代码 运行。

如果您希望始终具体化您的数据库查询,无论结果是否实际使用,请将 .AsEnumerable() 替换为 .ToArray().ToList()

至于为什么在您看来似乎是null,this answer可以提供指导。