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

时间:2013-04-11 19:58:57

标签: asp.net-mvc razor

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

然后,用户将根据下拉列表对每个夹具进行预测,然后我希望使用模型绑定将所有预测插入到一起。

我在我的观点中展示了以下相关代码,目前令我头疼:

@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)

我要做的是添加一个索引,这样我就可以在动作结果中对bind进行建模。

在html帮助行中,我收到以下错误:

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

任何人都可以给我指向正确的方向吗?

3 个答案:

答案 0 :(得分:7)

你正在使用IEnumerable,当然没问题,但是你需要了解你正在使用的是什么。枚举对于循环这样的东西很有用。它们经过优化,显然足够枚举,但优化意味着你只能一次

由于枚举实际上并没有“自身长度”的概念(它是为了将物品吐出物品直到它的物品,这就是全部)。它可以使用Count,但它必须计算它,并且是计算枚举它们的成员总数的唯一方法,并在它们经过时计算它们。这意味着你只需要运行枚举,所以你的for循环没有任何东西可以使用。

解决这个问题的方法是将它转换为不存在此问题的其他类型,例如list。它不像一个可以灵活的效率,但你别无选择。

您可以使用ToList()执行此操作,然后将其保存到您将用于计数和for循环的var中,或者使用IList<>之类的内容从头开始投射模型或ICollection<>代替IEnumerable<>

答案 1 :(得分:1)

通过调用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)

...

答案 2 :(得分:0)

当我将一个项目列表作为IEnumerable返回时,我一直收到此错误。我想手动检查是否从数据库返回正确的信息,因此,当我点击断点时,我会检查IEnumerable的内容。我不知道,直到我读到答案,我才阻止它在下面再次被枚举,它正在被处理。