装饰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);
}
}
写这篇文章的自然方式是:
public static IEnumerable<DocumentSearch> BuildDocumentSearch(IQueryable<Document> documents)
{
return documents.Select(doc => new DocumentSearch(doc));
}
当您调用一个IEnumerable扩展方法(如Select、Where、OrderBy等)时,您仍然在为将返回的结果添加配方。当您尝试访问IEnumerable的元素(如您的示例中所示)时,必须在那时解析结果集。
值得一提的是,while循环将更自然地写成foreach循环,尽管它在执行查询时应该具有相同的语义。