0

我有以下代码:

var docs = ctx.Documents.Select(a => 
    new { a.ID, Content = a.Document, a.LastModified, CreatedDate = a.Created });

foreach (var doc in docs)
{
    if (Utility.ContinueDocumentPreview)
    {
        _createFile(doc.ID, doc.Content, doc.CreatedDate, doc.LastModified);
        _fireProgress(++counter, count);
    }
    else
    {
        break;
    }
}

Utility.ContinueDocumentPreview 标志设置为假,当用户在此进程运行时点击取消按钮。问题是当标志为假并且代码应该跳出循环时,我得到一个 SQL 超时异常。

我做错了吗?

4

1 回答 1

0

可以在循环之前.ToList执行 SQL ,但这取决于您从数据库中获取的数据量。它可能会同时产生一个大的 SQL 查询,因此请对其进行大量测试,以确保获得您喜欢的性能。

// You can add .ToList() here:
var docs = ctx.Documents.Select(a => new { a.ID, Content = a.Document, a.LastModified, CreatedDate = a.Created }).ToList();

// Or, you can add .ToList() here:
foreach (var doc in docs.ToList())
{
    if (Utility.ContinueDocumentPreview)
    {
        _createFile(doc.ID, doc.Content, doc.CreatedDate, doc.LastModified);
        _fireProgress(++counter, count);
    }
    else
    {
        break;
    }
}
于 2012-10-01T17:13:51.660 回答