以下代码循环遍历resultSet
并填充SomeType
的列表a。
resultSet
本身是一个具有两个属性的匿名类型
var resultSet = SomeCollection.Select(x => new {
FirstProp = x,
SomeMembers = SomeLinkCollection.Where(l => l.SomeId == x.SomeId)
.Select(l => AnotherCollection[l.Id])
});
var result = new List<SomeType>();
foreach (var currentGroup in resultSet) {
result.Add(new SomeType {
Prop1 = currentGroup.Item.Id,
Prop2 = currentGroup.Item.Name,
Prop3 = currentGroup.SomeMembers.OrderBy(x => x.Name)
});
}
要删除设置新的Sometype
个实例,我使用动态类型创建了一个mapper类/接口来分割责任并使用依赖注入:
public class SomeMapper : ISomeMapper {
public List<SomeType> Map(dynamic resultSet) {
return resultSet.Select(new SomeType {
Prop1 = currentGroup.Item.Id,
Prop2 = currentGroup.Item.Name,
Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers)
.OrderBy(x => x.Name)
});
}
}
所以上面的代码变成了:
return resultSet.Select(SomeMapper.Map);
错误
无法隐式转换类型 'System.Collections.Generic.IEnumerable&GT;' 到'System.Collections.Generic.List'。显式转换 存在(你是否错过演员表?)
我尝试使用显式转换为SomeType
的一些技巧,但它在运行时失败
return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);
无法施放类型为
的物体 'WhereSelectListIterator2[AnotherType,System.Collections.Generic.List
1 [SOMETYPE]]' 输入'System.Collections.Generic.List`1 [SomeType]'。
答案 0 :(得分:3)
您需要创建结果列表。
只需在表达式后添加.ToList()
:
public class SomeMapper : ISomeMapper {
public List<SomeType> Map(dynamic resultSet) {
return resultSet.Select(new SomeType {
Prop1 = currentGroup.Item.Id,
Prop2 = currentGroup.Item.Name,
Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers).OrderBy(x => x.Name)
}).ToList();
}
}
.Select(...)
会返回IEnumerable<T>
,而不是List<T>
,所以这与此方法的问题完全相同:
public string Name()
{
return 10; // int
}
调用它时也会出现问题,请勿执行此操作:
return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);
这样做:
return statusGroupMapper.Map(groupSet);