我有一个方法从缓存中返回一个对象,我用它来填充系统中的选择列表。
var r = CacheHelper.GetCacheItem(...);
return new SelectList((IEnumerable)r, "Id", "Name");
r
的类型为System.Collections.Generic.List<<>f__AnonymousType39<string,int,string>>
使用IEnumerable enumerable = (IEnumerable)r;
我明白了
enumerable
看起来像这样:
[0]: { Name = "Lost", Id = 1, Area = null }
[1]: { Name = "Found", Id = 2, Area = null }
[2]: { Name = "Stock Adjustment", Id = 3, Area = null }
...
我希望能够使用LINQ来查询结果集以返回子集,同时将完整列表保留在内存中。类似的东西:
var s = enumerable.Where(x => x.Area == "myarea");
对类似SO问题的回答建议使用ToList(),但我不能在enumerable
上调用任何LINQ方法而不会收到System.Collections.IEnumerable' does not contain a definition for 'ToList'..
错误消息。 (我在代码中的其他位置使用ToList(),因此我对System.Linq
有一个有效的引用。
答案 0 :(得分:6)
理想情况下,您应该在整个系统中保留类型信息 - 并且可能会创建具有相关属性的名为的类型。然后你可以稍后再回到IEnumerable<SomeConcreteType>
。
如果您不能这样做,并且假设您使用的是C#4和.NET 4或更高版本,则可以使用动态类型:
IEnumerable<dynamic> enumerable = (IEnumerable<dynamic>) r;
...
var s = enumerable.Where(x => x.Area == "myarea");