在没有循环的情况下装饰IEnumerable

时间:2013-06-26 14:57:50

标签: c# performance ienumerable

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

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

1 个答案:

答案 0 :(得分:1)

写这个的自然方式是:

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

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

对于它的值,你的while循环可以更自然地编写为foreach循环,尽管它应该具有关于何时执行查询的相同语义。

相关问题