将ICollection自动映射到单个实体

时间:2014-08-25 14:22:07

标签: c# automapper

是否可以将ICollection映射到单个实体BonusDto?

我在Customer类中使用ICollection来获取所有行,并从我计算的行中获得保留&我希望映射到BonusDto的部分Bonus类中的PreviouslyPaid字段。

public class BonusDto 
    {
        public virtual long CustomerId { get; set; }

        public virtual decimal Retained { get; set; }
        public virtual decimal PreviouslyPaid { get; set; }
    }

  public class Customer
    {
        public virtual string Firstname { get; set; }
        public virtual ICollection<Bonus> Bonuses { get; set; }

    }

  public class CustomerDto
  {
        public virtual string Firstname { get; set; }
        public virtual BonusDto Bonus { get; set; }
  }

public partial class Bonus
    {
        private decimal _previouslyPaid;

        public decimal PreviouslyPaid
        {
            get
            {
                if (UsedDate.HasValue)
                {
                    _previouslyPaid += Amount;
                }
                return _previouslyPaid;
            }
        }

        private decimal _retained;

        public decimal Retained
        {
            get
            {
                if (!UsedDate.HasValue && DueDate > DateTime.UtcNow)
                {
                    _retained += Amount;
                }

                return _retained;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您必须使用BonusesBonus定义从ForMemberResolveUsing的映射。 将您自己的映射逻辑从ICollection<Bonus>传递到单个BonusDto

    static BonusDto YourLogic(Customer customer)
    {
        return new BonusDto() 
        { 
           Retained = customer.Bonuses.Select(b => b.Retained).Sum() 
        };
    }

    static void Main(string[] args)
    {
        AutoMapper.Mapper.CreateMap<Customer, CustomerDto>()
            .ForMember(dto => dto.Bonus, opt => opt.ResolveUsing(YourLogic));

        var customerDto = AutoMapper.Mapper.Map<CustomerDto>(customer);
    }