【问题标题】:MVC View - The result of a query cannot be enumerated more than onceMVC 视图 - 查询的结果不能多​​次枚举
【发布时间】:2013-04-11 19:58:56
【问题描述】:

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

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

我从我的角度显示了下面的相关代码,目前让我很头疼:

@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 帮助行中,我收到以下错误:

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

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

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    您使用的是IEnumerable,当然这很好,但您需要了解您使用的是什么。枚举非常适合 for 循环之类的事情。显然,它们已经过优化,可以枚举,但优化意味着您只能这样做一次

    因为枚举实际上并没有“自身长度”的概念(它被构建为吐出一个项目直到它用完项目,仅此而已)。它可以使用Count,但它必须计算它,并且是计算成员总数以枚举它们并在它们经过时计数它们的唯一方法。这意味着你刚刚运行了枚举,所以你的 for 循环没有任何用处。

    解决此问题的方法是将其转换为不存在此问题的其他类型,例如列表。它的效率不如 enumberable,但你别无选择。

    您可以使用 ToList() 执行此操作,然后将其保存到一个 var 中,用于计数和 for 循环,或者从一开始就使用 IList&lt;&gt;ICollection&lt;&gt; 之类的东西来转换您的模型而不是IEnumerable&lt;&gt;

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多