如何检索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>
如果你需要更多关于为什么我可能想要检索第一项的细节,请告诉我。
问题是你有一个动态对象和LINQ方法(ToList, FirstOrDefault),你试图使用的是IEnumerable<T>
上的扩展方法。当扩展方法像实例方法一样被调用时,DLR在运行时没有足够的信息来解析扩展方法。由于扩展方法实际上只是附加了特殊属性的静态方法,因此您也可以以静态样式调用它们:
var contentItems = Model.ContentItems;
dynamic firstItem = System.Linq.Enumerable.FirstOrDefault(contentItems);