枚举IQueryable时打破循环

时间:2012-10-01 17:10:14

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

我有以下代码:

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。问题是当标志为false并且代码突破循环时,我得到一个SQL超时异常。

我这样做不正确吗?

1 个答案:

答案 0 :(得分: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;
    }
}