Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从控制器接收模型(具有IEnumerable属性)时的奇怪行为_C#_Asp.net Core_Razor_Asp.net Core Mvc - Fatal编程技术网

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

C# 从控制器接收模型(具有IEnumerable属性)时的奇怪行为,c#,asp.net-core,razor,asp.net-core-mvc,C#,Asp.net Core,Razor,Asp.net Core Mvc,我面临着一种奇怪的行为。 保持简单,我在一个控制器中使用了这个方法 public async Task<IActionResult> IndexAsync() { var user = await userManager.GetUserAsync(this.User); var userEvents = context.Events .Where(e => e.AppIdentityUserId == user.Id) .AsEnume

我面临着一种奇怪的行为。 保持简单,我在一个控制器中使用了这个方法

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);
}
查询成功检索到该信息

这种情况发生了

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

如您所见,它仅在我展开相应的测试时填充。如果我在测试之前展开事件结果,列表将保持空

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

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

IEnumerable
被懒散地评估。如果没有迭代,则不会执行
IEnumerable
的实现

通过计算调试器中的值,可以使代码运行

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


至于为什么在您的视图中它看起来是空的,可以提供指导。

您可以用以下
var userEvents=context.events.Where(e=>e.AppIdentityUserId==user.Id).ToList()替换您的事件调用吗
更改为
.ToList()
实际上并没有解决问题,但我添加了一个查询,以从DbSet获取所有匹配的iten(它们添加了
ToList()
)。不过,我不需要把其他任何东西传递给我。我想知道将我的模型属性更改为
IList
List
是否会修复它。
public class Event
{
    //other properties
    public IEnumerable<Participant> ParticipantsList { get; set; }
}
foreach (var event in userEvents)
    test = context.Participants.Where(p => p.EventId == event.Id).AsEnumerable();