声明含匿名类型的列表遇类型转换错误,求解决方法
问题分析与解决方案
你遇到的问题核心是类型不兼容:finalEntries是List<MyDbTableEntity>类型的列表,但groupedItemList是分组后的匿名类型分组集合,两者完全不是同一类型,所以AddRange肯定会报错。
咱们一步步拆解问题:
- 你通过
Select(k => new { name = k.name.ToString(), data = k.info.ToString() })生成了匿名类型的序列; - 接着
GroupBy(k => k.name)把这个序列按name分组,得到的是List<IGrouping<string, 匿名类型>>——每个元素都是一个分组,包含分组键(name)和组内的所有匿名类型元素; - 而
finalEntries只能接受MyDbTableEntity类型的对象,自然无法直接添加分组集合。
下面分两种场景给你解决方案:
场景1:需要保留分组逻辑,把分组结果转为实体
如果你想把每个分组的内容合并成一个MyDbTableEntity实例(比如把组内的data合并成一个字符串),可以在分组后再加一层Select来转换类型:
var finalEntries = new List<MyDbTableEntity>(); var groupedItemList = _context.MyDbTableEntity .Select(k => new { name = k.name.ToString(), data = k.info.ToString() }) .GroupBy(k => k.name) // 把每个分组转换为MyDbTableEntity实例,这里示例将组内data用逗号分隔合并 .Select(group => new MyDbTableEntity { name = group.Key, // 分组的name作为实体的name info = string.Join(", ", group.Select(item => item.data)) // 合并组内的data }) .ToList(); finalEntries.AddRange(groupedItemList);
场景2:不需要分组,只是想把查询结果转为实体
如果你的分组操作是多余的,只是想把数据库查询到的数据转为MyDbTableEntity,那直接在Select里创建实体实例即可:
var finalEntries = new List<MyDbTableEntity>(); var itemList = _context.MyDbTableEntity .Select(k => new MyDbTableEntity { name = k.name.ToString(), info = k.info.ToString() }) .ToList(); finalEntries.AddRange(itemList);
额外提醒
- 匿名类型是C#编译器自动生成的临时类型,只能在定义它的代码作用域内使用,而且无法直接转换为自定义实体类型,必须显式创建实体并赋值属性;
GroupBy的返回结果是分组集合(IGrouping<TKey, TElement>),不是单个实体或实体列表,一定要先处理分组内容再转换类型。
内容的提问来源于stack exchange,提问作者Kurkula
相关产品推荐
相关产品推荐

