我们如何检索WhereSelectListIterator的第一项?

Sha*_*tin 4 c# linq orchardcms orchardcms-1.8

我们如何检索第一项WhereSelectListIterator?通常,我使用foreach循环来迭代.有没有办法称相当于myResult[0]myResult.FirstOrDefault().两者都抛出错误.myResult.ToList()也不起作用.我开始认为我们唯一可以做的WhereSelectListIterator就是迭代了foreach.

这是场景:我创建了一个带有Shape布局的Orchard Query.形状模板包含以下代码:

@{
    // 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>
Run Code Online (Sandbox Code Playgroud)

具体来说,contentItems是类型

System.Linq.Enumerable.WhereSelectListIterator<
    Orchard.Projections.Descriptors.Layout.LayoutComponentResult,
    Orchard.ContentManagement.ContentItem>
Run Code Online (Sandbox Code Playgroud)

如果您需要有关我可能想要检索第一项的原因的详细信息,请与我们联系.

Mik*_*ray 7

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

var contentItems = Model.ContentItems;
dynamic firstItem = System.Linq.Enumerable.FirstOrDefault(contentItems);
Run Code Online (Sandbox Code Playgroud)

  • 铸造也使用相同的原理.`dynamic firstItem =(contentItems as IEnumerable <dynamic>).First();` (2认同)