当我在枚举结果之前得到Count()时,为什么会得到“查询的结果不能多​​次枚举”?

时间:2011-09-28 18:39:26

标签: .net entity-framework

这是我的代码。简化了可读性

var query = from p in people select p;

// here is the point that probably causes the issue
ObjectResult<int> idsThatMatch = getIdsThatMatchFullTextSearch("andre");
query = from p in query where idsThatMatch.Contains(p.id) select p;

var count = query.Count();
query = query.OrderBy(p => p.id);
var pessoas = query.Skip(90).Take(30).ToList();

我需要在skip / take之前读取计数以获取分页前的总记录数。伯爵工作正常。但是在我的摘录的最后一行,它会触发异常

  

无法多次枚举查询结果

为什么呢?算盘不应该枚举任何东西。我该如何解决?谢谢

修改

人们认为我使用的是存储过程,但我不是。其实我正在使用“选择”。代码低于评论。

编辑2

我刚刚在没有“select in”部分的情况下测试了上面的代码,它工作正常

编辑3

使用此行有效:

ObjectResult<int> idsThatMatch = (getIdsThatMatchFullTextSearch("andre");
query = from p in query where idsThatMatch.Contains(p.id) select p).ToArray();

谢谢

2 个答案:

答案 0 :(得分:4)

问题在于这一行:

ObjectResult<int> idsThatMatch = getIdsThatMatchFullTextSearch("andre");

这会返回ObjectResult而不是ObjectQueryIQueryable。结果只能迭代一次。使用Count执行第一个查询后,您将无法再使用结果,并且第二个查询执行将失败,因为它将尝试再次迭代结果。

ObjectResult未在数据库端处理 - 它是执行ObjectQuery的结果,一次执行只能有一个结果集枚举。它就像游标在应用程序中迭代结果集一样。

答案 1 :(得分:1)

您的人员可能来自映射在Entity Framework模型中的存储过程。 在这种情况下,您无法对其进行过滤或跳过,因为结果已经过评估。

The result of a query cannot be enumerated more than once

The query results cannot be enumerated more than once?