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();