查询的结果不能被枚举多次
本文关键字:枚举 不能 结果 查询 | 更新日期: 2023-09-27 18:17:28
我在这个线程中有一个关于并行和任务的问题。与这个问题相关的上一个问题
我试图做的是迭代从实体框架通过一个进程返回的集合。
所有查询在第一个循环上都是完美的,但在第二个循环上,当我试图跳过以前的查询结果时,我得到了一个查询的结果不能被枚举不止一次错误。
我意识到调试器告诉我不能以这种方式对这个集合进行分页。
我如何使用。skip()而不得到那个错误?我需要能够遍历整个集合,直到到达终点。
这么做有什么魔力吗?
就像我提到的,我可以循环一次,但之后我就会得到那个错误。
帮助!
ObjectResult<Guid?> memIDs = await Task.Run(() => db.proc_GetCollaborator_UserIDs(projectID));
if (memIDs != null)
{
while (true)
{
var t = memIDs.Take(Environment.ProcessorCount)
.Select(id => Task.Run(() => projCollabors.Add(new Collaborator(id.Value, projectID))))
.Skip(skip)
.ToArray();
if (t.Length == 0) { break; };
skip += Environment.ProcessorCount;
await Task.WhenAll(t);
};
};
您的查询memIDs.Take(Environment.ProcessorCount)
总是从memIDs
中获取第一个Environment.ProcessorCount
项。
下次调用.Take
时,它不会"记住"你取了一定数量的物品——它总是从头开始。
因为你在循环中调用它,所以memIDs
被反复枚举。我想这就是错误的来源。
你可以把它变成一个列表来解决这个问题,像这样:
var memIDsList = memIDs.ToList();
然后用memIDsList
代替memIDs
。
但是,这对错误的查询逻辑没有帮助。我猜你是想一次取N个项目,然后对它们做点什么?
如果是,你可以使用MoreLinq的Batch
扩展。(有关Batch
的更多信息,请参见在linq中创建批量)
我不知道使用Batch
是否会避免需要.ToList()
,但你应该尝试不使用。