簡體   English   中英

查詢的結果不能多​​次枚舉

[英]The result of a query cannot be enumerated more than once

我在這個帖子中有一個關於Parelle和Task的問題。 上一個問題與此相關

我試圖做的是通過sproc遍歷從實體框架返回的集合。

一切查詢完全在第一個循環,但在第二個,當我嘗試跳過前面的查詢結果我得到一個查詢的結果不能被多次枚舉錯誤。

我意識到調試器告訴我,我不能以這種方式分頁這個集合。

我如何使用.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重復枚舉memIDs 我在想這就是錯誤的來源。

您可以通過將其轉換為如下列表來解決此問題:

var memIDsList = memIDs.ToList();

然后使用memIDsList而不是memIDs

但是,這對您的錯誤查詢邏輯沒有幫助。 我假設你一次嘗試N個項目並用它們做點什么?

如果是這樣,您可以使用MoreLinq的 Batch擴展。 (有關Batch詳細信息,請參閱在linq中創建批次 。)

我不知道使用Batch是否會避免使用.ToList() ,但你應該不用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM