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



我有一个对象图,我正在使用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>();

当我返回FooDto时,我希望BarDto的集合根据以下条件进行排序。如果SortBarByName为true,我希望根据Foo类的SortBarByName属性,按名称对BarDto进行排序;如果SortBar ByName为false,我希望按SortOrder对BarDto进行排序。

注意:Name属性不存在于Bar类中,它只存在于BarDto中。

我可以在自动映射器中做些什么来实现这一点吗?

由于您要用于订单的属性之一只有在映射数据后才可用,因此您可以使用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进行排序。

最新更新