使用 Automapper 将字符串映射到 List<string>,反之亦然
Mapping string to List<string> and vice versa using Automapper
基本上我有这个 class 代表 1:1 我的数据库
public class User
{
public int UserID { get; set; }
public string Username { get; set; }
public string Role { get; set; }
}
我有这个视图模型
public class UserEditViewModel
{
public UserEditViewModel()
{
Roles = new List<string>();
}
public int UserID { get; set; }
[Required]
public string Username { get; set; }
[Required]
public List<string> Roles { get; set; }
}
我不知道如何在这两个之间映射。我当前的设置:
Mapper.CreateMap<UserEditViewModel, User>().ReverseMap();
这里有类似你的问题,请你看看AutoMapper: Collection to Single string Property
PS:这是一个将集合映射到单个字符串的示例 属性 可能您的示例如下所示;
Mapper.CreateMap<User, UserEditViewModel>()
.ForMember(dest => dest.Roles,
m => m.MapFrom(src => src.Role.Split(',').ToList()));
并像下面这样映射实例;
User myUser = new User();
myUser.Role = "r1,r2,r3,r4,r5";
myUser.UserID = 1;
myUser.Username = "MyUserName";
UserEditViewModel result = Mapper.Map<UserEditViewModel>(myUser);
2020 编辑:由于 Expression.Call
API 不支持可选参数,您应该将 src.Role.Split(',')
替换为 src.Role.Split(',', System.StringSplitOptions.None)
或 src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)
如果您想连接字符串列表中的所有值,您需要使用 string.Join
。在映射器中,您需要使用 ForMember
方法。
从 UserEditViewModel
到 User
:
Mapper.CreateMap<User, UserEditViewModel>().ForMember(user => user.Role, opt => opt.MapFrom(userEdit => string.Join(", ", userEdit.Roles)));
从 User
到 UserEditViewModel
:
Mapper.CreateMap<UserEditViewModel, User>().ForMember(userEdit => userEdit.Roles, opt => opt.MapFrom(user => user.Role.Split(",").ToList()));
我认为您应该可以使用 AutoMapper AfterMap,如下所示:
.AfterMap((src,dest) => dest.Roles.Add(src.Role))
此处归功于答案:Map a property to a collection item
将字符串映射到集合 Cihan Uygun 的 答案有效,只是为了修复错误
CS0854 An expression tree may not contain a call or invocation that
uses optional arguments
这是在以后的更新中引起的,您应该将 src.Role.Split(',')
替换为 src.Role.Split(',', System.StringSplitOptions.None)
或 src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)
要执行 反向映射 只需使用 src => string.Join(',', src.Roles)
错误修复的来源:https://newbedev.com/mapping-string-to-list-string-and-vice-versa-using-automapper
基本上我有这个 class 代表 1:1 我的数据库
public class User
{
public int UserID { get; set; }
public string Username { get; set; }
public string Role { get; set; }
}
我有这个视图模型
public class UserEditViewModel
{
public UserEditViewModel()
{
Roles = new List<string>();
}
public int UserID { get; set; }
[Required]
public string Username { get; set; }
[Required]
public List<string> Roles { get; set; }
}
我不知道如何在这两个之间映射。我当前的设置:
Mapper.CreateMap<UserEditViewModel, User>().ReverseMap();
这里有类似你的问题,请你看看AutoMapper: Collection to Single string Property
PS:这是一个将集合映射到单个字符串的示例 属性 可能您的示例如下所示;
Mapper.CreateMap<User, UserEditViewModel>()
.ForMember(dest => dest.Roles,
m => m.MapFrom(src => src.Role.Split(',').ToList()));
并像下面这样映射实例;
User myUser = new User();
myUser.Role = "r1,r2,r3,r4,r5";
myUser.UserID = 1;
myUser.Username = "MyUserName";
UserEditViewModel result = Mapper.Map<UserEditViewModel>(myUser);
2020 编辑:由于 Expression.Call
API 不支持可选参数,您应该将 src.Role.Split(',')
替换为 src.Role.Split(',', System.StringSplitOptions.None)
或 src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)
如果您想连接字符串列表中的所有值,您需要使用 string.Join
。在映射器中,您需要使用 ForMember
方法。
从 UserEditViewModel
到 User
:
Mapper.CreateMap<User, UserEditViewModel>().ForMember(user => user.Role, opt => opt.MapFrom(userEdit => string.Join(", ", userEdit.Roles)));
从 User
到 UserEditViewModel
:
Mapper.CreateMap<UserEditViewModel, User>().ForMember(userEdit => userEdit.Roles, opt => opt.MapFrom(user => user.Role.Split(",").ToList()));
我认为您应该可以使用 AutoMapper AfterMap,如下所示:
.AfterMap((src,dest) => dest.Roles.Add(src.Role))
此处归功于答案:Map a property to a collection item
将字符串映射到集合 Cihan Uygun 的 答案有效,只是为了修复错误
CS0854 An expression tree may not contain a call or invocation that uses optional arguments
这是在以后的更新中引起的,您应该将 src.Role.Split(',')
替换为 src.Role.Split(',', System.StringSplitOptions.None)
或 src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)
要执行 反向映射 只需使用 src => string.Join(',', src.Roles)
错误修复的来源:https://newbedev.com/mapping-string-to-list-string-and-vice-versa-using-automapper