9_A*_*9_A 5 c# sorting nhibernate fluent-nhibernate 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; }
}
Run Code Online (Sandbox Code Playgroud)
我的映射看起来像:-
public class FooDto
{
public IEnumerable<BarDto> Bars { get; set; }
}
public class BarDto
{
public string Name { get; set; }
public int SortOrder { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的映射看起来像:
mapper.CreateMap<Foo, FooDto>().ForMember(d => d.Bars, o => o.MapFrom(s => s.Bars));
mapper.CreateMap<Bar, BarDto>();
Run Code Online (Sandbox Code Playgroud)
当我返回 FooDto 时,我希望根据以下条件对 BarDto 集合进行排序。如果 SortBarByName 为真,我想按名称对 BarDto 进行排序,如果 SortBarByName 为假,则根据 SortOrder 对 BarDto 进行排序,基于 Foo 类的 SortBarByName 属性。
注意: Name 属性不存在于 Bar 类中,它只存在于 BarDto 中。
我可以在 AutoMappers 中做些什么来实现这一目标吗?
由于您要用于订单的属性之一仅在您映射数据后才可用,因此您可以AfterMap()像这样使用AutoMapper的功能:
mapper.CreateMap<Foo, FooDto>()
.AfterMap(
(foo, dto) =>
{
dto.Bars = foo.SortBarByName
? dto.Bars.OrderBy(x => x.Name)
: dto.Bars.OrderBy(x => x.SortOrder);
});
Run Code Online (Sandbox Code Playgroud)
这应该Bars在所有数据可用后进行排序。