如何检索WhereSelectListIterator的第一项?

本文关键字:一项 WhereSelectListIterator 何检索 检索 | 更新日期: 2023-09-27 18:16:48

如何检索WhereSelectListIterator的第一项?通常,我使用foreach循环来迭代。有没有办法叫myResult[0]myResult.FirstOrDefault()的等价物。两者都抛出错误。myResult.ToList()也不行。我开始认为,我们唯一能做的WhereSelectListIterator就是迭代foreach

下面是这个场景:我创建了一个具有形状布局的果园查询。形状模板包含以下代码:

@{
    // content items is of type WhereSelectListIterator<T,T>
    var contentItems = Model.ContentItems;
    dynamic firstItem = null;
    // {"Cannot apply indexing with [] to an expression of type 'object'"}
    //// firstItem = contentItems[0];
    // {"'object' does not contain a definition for 'ToList'"}
    // var items = contentItems.ToList();
    // get the title of the first content item
    // this is what DOES work
    foreach (var contentItem in contentItems)
    {
        firstItem = contentItem;
        break;
    }
}
<h2>@(firstItem != null ? firstItem.TitlePart.Title : "Got Nothing")</h2>

具体来说,contentItems的类型为

System.Linq.Enumerable.WhereSelectListIterator<
    Orchard.Projections.Descriptors.Layout.LayoutComponentResult,
    Orchard.ContentManagement.ContentItem>

如果你需要更多关于为什么我可能想要检索第一项的细节,请告诉我。

如何检索WhereSelectListIterator的第一项?

问题是你有一个动态对象和LINQ方法(ToList, FirstOrDefault),你试图使用的是IEnumerable<T>上的扩展方法。当扩展方法像实例方法一样被调用时,DLR在运行时没有足够的信息来解析扩展方法。由于扩展方法实际上只是附加了特殊属性的静态方法,因此您也可以以静态样式调用它们:

var contentItems = Model.ContentItems;
dynamic firstItem = System.Linq.Enumerable.FirstOrDefault(contentItems);