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