这是我的代码。简化了可读性
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();
谢谢
答案 0 :(得分:4)
问题在于这一行:
ObjectResult<int> idsThatMatch = getIdsThatMatchFullTextSearch("andre");
这会返回ObjectResult
而不是ObjectQuery
或IQueryable
。结果只能迭代一次。使用Count
执行第一个查询后,您将无法再使用结果,并且第二个查询执行将失败,因为它将尝试再次迭代结果。
ObjectResult
未在数据库端处理 - 它是执行ObjectQuery
的结果,一次执行只能有一个结果集枚举。它就像游标在应用程序中迭代结果集一样。
答案 1 :(得分:1)
您的人员可能来自映射在Entity Framework模型中的存储过程。 在这种情况下,您无法对其进行过滤或跳过,因为结果已经过评估。