MVC视图-查询的结果不能枚举多次



我有一个现有的存储过程,当它被调用时,它会用周的足球赛程填充一个表。

然后,用户将从下拉列表中对每个固定装置进行预测,然后我希望使用模型绑定将所有预测插入到一起。

我已经从我的视图中显示了下面的相关代码,这目前让我头疼:

@model IEnumerable<PPLMVCNewOne.Models.sp_getMakeYourPredictions_Result>

@for (int i = 0; i < Model.Count(); i++)
    {
    <tr>
        <td>
            @Html.DisplayFor(m => m.ElementAt(i).Home_Team)

我想做的是添加一个索引,这样我就可以在操作结果中对绑定进行建模。

在html助手行中,我得到了以下错误:

查询的结果不能枚举多次。

谁能给我一个指向正确方向的指针吗?

您使用的是IEnumerable,当然这很好,但您需要了解使用的是什么。枚举对于for循环之类的事情非常有用。它们被优化为,很明显,被枚举,但优化意味着你只能做一次

由于枚举实际上并没有"自身长度"的概念(它是为了吐出一个项,直到它没有项为止,仅此而已(。它可以使用Count,但它必须计算它,这也是计算成员总数的唯一方法,即枚举它们并在它们经过时对它们进行计数。这意味着你刚刚运行了枚举,所以你的for循环没有什么可用的。

解决这个问题的方法是将它强制转换为其他类型,例如list,这样就不会出现这个问题。它的效率不如枚举器,但你别无选择。

您可以使用ToList()执行此操作,然后将其保存到将用于计数和for循环的var中,或者从一开始就使用IList<>ICollection<>而不是IEnumerable<>来强制转换模型。

通过调用ToList((使操作返回IList而不是IEnumerable。

将视图更改为此

@model IList<PPLMVCNewOne.Models.sp_getMakeYourPredictions_Result>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
    <td>
        @Html.DisplayFor(m => m.ElementAt(i).Home_Team)
...

当我以IEnumerable的形式返回项目列表时,我一直收到这个错误。我想手动检查数据库中是否返回了正确的信息,所以,当我遇到断点时,我会检查IEnumerable的内容。在我不知道的情况下,直到我读到答案,我才阻止它在下面被再次枚举,也就是它被处理的地方。

最新更新