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));