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

本文关键字:枚举 不能 结果 查询 | 更新日期: 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(),但你应该尝试不使用。