2013-06-26 41 views
0

我需要从IQueryable创建一个IEnummerable的DcumentSearch对象 以下代码会导致数据库加载使我的应用程序变慢的整个结果。装饰IEnumerable而不循环

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

您正在枚举所有文档并且不希望加载所有文档?在这种情况下你会列举什么? –

+0

使用IEnumerable时应该修饰它 – Aphelion

+1

您显示的代码不应该加载数据库中的数据。只有在枚举该方法的结果时,才能加载数据。这是正确的,因为否则你就没有什么可迭代的。 –

回答

1

写这个的自然的方式是:

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

当你调用的IEnumerable的扩展方法,如选择,其中,排序依据等,你仍然增加了几招结果一个将被退回。当您尝试访问IEnumerable的元素(如您的示例中所示)时,必须在此时解析结果集。

对于什么是值得的,while循环会更自然地写成foreach循环,尽管它应该具有与执行查询时相同的语义。

+0

创建IEnumerable时,这段代码不会触发数据库。这是我正在寻找的。 UI网格使用该结果一次加载几行,从而获得更快的页面。谢谢! – chadisbad