【问题标题】:AutoMapper and Sorting the child collection conditionallyAutoMapper 和有条件地对子集合进行排序
【发布时间】:2018-11-12 06:53:54
【问题描述】:

我有一个使用 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 为真,我想按名称对 BarDto 进行排序,如果 SortBarByName 为假,我想按 SortOrder 排序,基于类 Foo 的 SortBarByName 属性。

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

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

【问题讨论】:

  • 您是否尝试过使用ForMember() 来根据需要映射bar 属性?你可以在那里应用你的排序。
  • 您的Bar 对象中也有SortOrder 属性吗?
  • @RedFox 是的,SortOrder 存在于 Bar 对象中,但 Name 不在 Bar 对象中。请查看我的编辑。

标签: c# sorting nhibernate fluent-nhibernate automapper


【解决方案1】:

由于您要用于订单的属性之一仅在映射数据后可用,因此您可以使用 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

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多