装饰IEnumerable而不循环

本文关键字:循环 IEnumerable 装饰 | 更新日期: 2023-09-27 18:19:56

我需要从IQueryable创建DcumentSearch对象的IEnummerable下面的代码导致数据库加载整个结果,这使我的应用程序速度变慢。

public static IEnumerable<DocumentSearch> BuildDocumentSearch(IQueryable<Document> documents)
{
    var enumerator = documents.GetEnumerator();
    while(enumerator.MoveNext())
    {
        yield return new DocumentSearch(enumerator.Current);
    }    
}

装饰IEnumerable而不循环

写这篇文章的自然方式是:

public static IEnumerable<DocumentSearch> BuildDocumentSearch(IQueryable<Document> documents)
{
    return documents.Select(doc => new DocumentSearch(doc));
}

当您调用一个IEnumerable扩展方法(如Select、Where、OrderBy等)时,您仍然在为将返回的结果添加配方。当您尝试访问IEnumerable的元素(如您的示例中所示)时,必须在那时解析结果集。

值得一提的是,while循环将更自然地写成foreach循环,尽管它在执行查询时应该具有相同的语义。