1

我在这个线程中有一个关于 Parelle 和 Task 的问题。与此相关的上一个问题

我正在尝试做的是迭代通过存储过程从实体框架返回的集合。

在第一个循环中,所有查询都完美无缺,但在第二个循环中,当我尝试跳过先前的查询结果时,我得到一个查询结果不能多​​次枚举错误。

我意识到调试器告诉我我不能以这种方式分页这个集合。

如何使用 .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);
    };
};
4

1 回答 1

3

您的查询memIDs.Take(Environment.ProcessorCount)总是Environment.ProcessorCountmemIDs.

它不会“记住”你下次调用它时拿了一定数量的物品.Take——它总是会从头开始。

因为你在循环中调用它,memIDs所以被反复枚举。我在想这就是错误的来源。

您可以通过将其转换为如下列表来解决此问题:

var memIDsList = memIDs.ToList();

然后使用memIDsList代替memIDs.

但是,这对您错误的查询逻辑没有帮助。我假设您尝试一次拿 N 件物品并用它们做点什么?

如果是这样,您可以使用MoreLinq 的 Batch扩展。(有关更多信息,请参阅在 linq 中创建批处理Batch。)

我不知道 usingBatch是否会避免需要.ToList(),但您应该尝试不使用。

于 2013-06-08T23:08:50.193 回答