2013-04-11 36 views
3

我有一个现有的存储过程,当它被调用时,用星期的足球夹具填充一个表。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辅助线:

查询的结果不能枚举不止一次。

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

回答

7

您使用的是IEnumerable,这是很好的,当然,但你需要了解你正在使用的东西。枚举非常适合循环之类的事情。他们被优化,显然是列举了以上,但优化意味着你只能做到这一点一次

由于枚举并没有真正具有“自身长度”的概念(它的构建是吐出一个项目,直到它没有项目,这就是全部)。它可以使用Count,但它必须计算,并计算成员的总数的唯一方法来枚举它们并计算它们。这意味着你只需运行枚举,所以for循环没有任何可用的地方。

解决此问题的方法是将其转换为不具有此问题的不同类型,如列表。它并不像可执行的那样高效,但你别无选择。

你可以做到这一点使用ToList(),然后保存到您要使用的计数和for循环或者只是使用类似IList<>ICollection<>代替IEnumerable<>开始投你的模型既变种。

+0

谢谢你们俩;作品很好解释 – Ossieboy 2013-04-12 12:00:16

+0

。 – User 2015-11-18 03:57:55

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) 

... 
0

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