Automapper возвращает пустую коллекцию, мне нужен null
public class Person
{
Name { get; set; }
IEnumerable<Address> Addresses { get; set; }
}
public class PersonModel
{
Name { get; set; }
IEnumerable<AddressModel> Addresses { get; set; }
}
если я карту Person
to PersonModel
вот так:
Mapper.DynamicMap<Person, PersonModel>(person);
если Addresses
собственности на Person
равно null, они отображаются на PersonModel
пустой Enumerable
вместо null.
как сделать PersonModel
иметь null Addresses
вместо пустой Enumerable
?
4 ответов
поэтому, вероятно, есть несколько способов сделать это с помощью Automapper, и это только один:
Mapper.CreateMap<Person, PersonMap>()
.AfterMap( (src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null );
этот код использует новый c# ?.
оператор для безопасности null, поэтому вам может потребоваться удалить его и проверить null, если вы не можете использовать эту функцию в своем коде.
простой ответ-использовать AllowNullCollections
:
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.AllowNullCollections = true;
});
или если вы используете API экземпляра
new MapperConfiguration(cfg =>
{
cfg.AllowNullCollections = true;
}
другой альтернативой этому является использование условия, поэтому сопоставьте значение только тогда, когда значение не равно null. Это может потребовать, чтобы значение по умолчанию равно null (поскольку оно не будет отображаться)
Mapper.CreateMap<Person, PersonModel>()
.ForMember(
dest => dest.Addresses,
opt => opt => opt.Condition(source=> source.Addresses!= null));
вы должны иметь возможность определить пользовательский распознаватель для свойства, на котором вы хотите это поведение. Что-то вроде:
Mapper.CreateMap<Address, AddressModel>();
Mapper.CreateMap<Person, PersonModel>()
.ForMember(
dest => dest.Addresses,
opt => opt.ResolveUsing(person => person.Addresses.Any() ? person.Addresses.Select(Mapper.Map<Address, AddressModel>) : null));