将空列表自动映射到空列表
Automapper empty list to empty list
我有以下两个class:
我有两个 classes
public class SourceClass
{
public Guid Id { get; set; }
public string Provider { get; set; }
}
public class DestinationClass
{
public Guid Id { get; set; }
public List<string> Providers { get; set; }
}
我的自动映射器有以下映射
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => new List<string> {src.Provider ?? ""}));
CreateMap<DestinationClass, SourceClass>().ForMember(SourceClass => SourceClass.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我写了一些单元测试,可以确认以下行为:
当我的目的地 class 中的 Providers 为 null 时,它映射到 null,这很棒。但是,我想更改我的映射,以便如果 Providers 是一个空列表,它会映射到一个空列表,同样,如果 Provider 是 null,我希望它映射到一个空列表而不是一个列表空字符串。
有人知道我该怎么做吗?我已经尝试过从 SourceClass 到 DestinationClass 的映射:
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => !string.IsNullOrEmpty(src.Provider) ? new List<string> {src.Provider} : new List<string>()));
但是反过来,一个空列表映射到 null,而不是一个空列表。 (我认为是因为 FirstOrDefault() )。有谁知道我该如何解决这个问题?
是的。我认为这是因为它的 FirstOrDefaults( ) .. 为什么不使用相同的三元运算符或 if 语句来放置映射条件?
已使用 AutoMapper 6.1.1 测试此映射
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SourceClass, DestinationClass>()
.ForMember(dest => dest.Providers,
opt => opt.MapFrom(src => string.IsNullOrEmpty(src.Provider) ? new List<string>()
: new List<string> { src.Provider }));
cfg.CreateMap<DestinationClass, SourceClass>()
.ForMember(dest => dest.Provider,
opt => opt.MapFrom(src => src.Providers == null ? ""
: src.Providers.FirstOrDefault() ?? ""));
});
如果您真的想要它 "inline" 就可以了。我仍然认为,如果您将它移出到您可以调用的方法中,或者如果您可以升级 AutoMapper 以利用内置的转换器映射,它会更容易阅读。希望这能为您提供足够的信息来开始。
我有以下两个class:
我有两个 classes
public class SourceClass
{
public Guid Id { get; set; }
public string Provider { get; set; }
}
public class DestinationClass
{
public Guid Id { get; set; }
public List<string> Providers { get; set; }
}
我的自动映射器有以下映射
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => new List<string> {src.Provider ?? ""}));
CreateMap<DestinationClass, SourceClass>().ForMember(SourceClass => SourceClass.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我写了一些单元测试,可以确认以下行为:
当我的目的地 class 中的 Providers 为 null 时,它映射到 null,这很棒。但是,我想更改我的映射,以便如果 Providers 是一个空列表,它会映射到一个空列表,同样,如果 Provider 是 null,我希望它映射到一个空列表而不是一个列表空字符串。
有人知道我该怎么做吗?我已经尝试过从 SourceClass 到 DestinationClass 的映射:
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => !string.IsNullOrEmpty(src.Provider) ? new List<string> {src.Provider} : new List<string>()));
但是反过来,一个空列表映射到 null,而不是一个空列表。 (我认为是因为 FirstOrDefault() )。有谁知道我该如何解决这个问题?
是的。我认为这是因为它的 FirstOrDefaults( ) .. 为什么不使用相同的三元运算符或 if 语句来放置映射条件?
已使用 AutoMapper 6.1.1 测试此映射
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SourceClass, DestinationClass>()
.ForMember(dest => dest.Providers,
opt => opt.MapFrom(src => string.IsNullOrEmpty(src.Provider) ? new List<string>()
: new List<string> { src.Provider }));
cfg.CreateMap<DestinationClass, SourceClass>()
.ForMember(dest => dest.Provider,
opt => opt.MapFrom(src => src.Providers == null ? ""
: src.Providers.FirstOrDefault() ?? ""));
});
如果您真的想要它 "inline" 就可以了。我仍然认为,如果您将它移出到您可以调用的方法中,或者如果您可以升级 AutoMapper 以利用内置的转换器映射,它会更容易阅读。希望这能为您提供足够的信息来开始。