AutoMapper 和有条件地对子集合进行排序

AutoMapper and Sorting the child collection conditionally

我有一个对象图,我正在使用 Fluent NHibernate 和 AutoMapper 从数据库加载到 DTO:-

public class Foo
{
  public int Id { get; set; }
  public virtual ICollection<Bar> Bars { get; set; }
  public bool SortBarByName
}

public class Bar
{
  public int Id { get; set; }
  public int SortOrder { get; set; }
  public virtual Foo Foo { get; set; }
}

我的映射看起来像:-

public class FooDto
{
  public IEnumerable<BarDto> Bars { get; set; }
}

public class BarDto
{
  public string Name { get; set; }
  public int SortOrder { get; set; }
}

我的映射看起来像:

mapper.CreateMap<Foo, FooDto>().ForMember(d => d.Bars, o => o.MapFrom(s => s.Bars));
mapper.CreateMap<Bar, BarDto>();

当我 return FooDto 时,我希望根据以下条件对 BarDto 集合进行排序。 如果 SortBarByName 为真,我想按名称对 BarDto 进行排序;如果 SortBarByName 为假,我想按 SortOrder 排序,基于 class Foo 的 SortBarByName 属性。

注意: 名称 属性 不存在于 Bar class 中,它仅存在于 BarDto 中。

我可以在 AutoMappers 中做些什么来实现这个吗?

由于您要用于订单的属性之一仅在 映射数据后 可用,因此您可以像这样使用 AutoMapper 的 AfterMap() 功能:

mapper.CreateMap<Foo, FooDto>()
                .AfterMap(
                    (foo, dto) =>
                    {
                        dto.Bars = foo.SortBarByName
                            ? dto.Bars.OrderBy(x => x.Name)
                            : dto.Bars.OrderBy(x => x.SortOrder);
                    });

这应该在所有数据可用后订购 Bars