【问题标题】:Breaking a loop when enumerating an IQueryable枚举 IQueryable 时中断循环
【发布时间】:2012-09-22 13:43:17
【问题描述】:

我有以下代码:

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 标志设置为 false。问题是当标志为假并且代码应该跳出循环时,我得到一个 SQL 超时异常。

我做错了吗?

【问题讨论】:

  • 从您提供的代码来看,我认为您的问题与循环无关。您是否检查了堆栈跟踪以确认这与您的循环有关?
  • 当您不取消时,一切运行正常吗? doc.Content 可以有多大?

标签: c# sql-server-2008 entity-framework-4 foreach iqueryable


【解决方案1】:

可以使用.ToList 来执行SQL before循环,但这在某种程度上取决于您从数据库中获取的数据量。它可能会导致一次大型 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2013-06-12
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多