C#中使用Automapper ProjectTo将string属性映射为char时EF6报错如何解决
报错原因
ProjectTo执行时会将AutoMapper的映射规则转换为表达式树,交给EF6的LINQ to Entities提供器解析生成SQL。你原映射中用到的string[int]索引器本质是调用String.get_Chars(Int32)方法,EF6没有内置该方法的SQL转换逻辑,因此触发不支持异常。
解决方案
方案1:修改映射规则,使用EF6可识别的SQL函数
EF6内置了对System.Data.Entity.SqlServer.SqlFunctions类中方法的SQL转换支持,我们可以用Substring方法替代索引器取第一个字符,映射配置修改如下:
using System.Data.Entity.SqlServer; cfg.CreateMap<Team, TeamDto>() .ForMember(x => x.Flag, opts => opts.MapFrom(src => src.Flag != null ? SqlFunctions.Substring(src.Flag, 1, 1).FirstOrDefault() : (char?)null ));
这里SqlFunctions.Substring对应SQL的SUBSTRING函数,取长度为1的第一个字符,EF6可以正常将其转换为SQL语句执行,不会触发方法不识别的问题。
方案2:先加载数据到内存再映射
如果你的数据量较小,不想依赖SqlServer相关的函数类,可以先将EF查询结果加载到内存,再执行映射,跳过LINQ to Entities的表达式解析步骤:
// 先ToList触发查询加载数据到内存,再手动映射 var result = dbContext.Teams.ToList() .Select(mapper.Map<TeamDto>) .ToList();
注意该方案会先加载Team表的所有字段到内存,数据量大时会有额外的性能和内存开销,仅适合小数据量场景使用。
内容的提问来源于stack exchange,提问作者jdidi
相关产品推荐
相关产品推荐

