Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automapper - Flatten with list at the same time

Tags:

c#

automapper

I have a view model that I've received from the client which looks something like this

public class OrderViewModel
{
     public string Name{get;set;}
     public string ContactDetails {get;set;}
     public List<FunkyThing_ViewModel> {get;set;}
}

public class FunkyThing_ViewModel
{
    public string ThingName{get;set;}
    public string Colour{get;set;}
    public string Size{get;set;}
}

I wish to map this to a list of domain models where each which looks something more like this:

public class Order
{
   public string Name{get;set;}
   public string ContactDetails {get;set;}
   public string ThingName{get;set;}
   public string Colour{get;set;}
   public string Size{get;set;}
}

So I'm wanting do end up with something that looks like this:

List<Order> orders = new Orders();
Mapper.CreateMap<OrderViewModel, List<Order>>();
//Something in here to ensure each funky thing creates an additional order....

Mapper.Map(viewModel, orders);
like image 419
Chris Nevill Avatar asked Jun 07 '13 12:06

Chris Nevill


People also ask

Does AutoMapper map both ways?

Yes, or you can call CreateMap<ModelClass, ViewModelClass>(). ReverseMap() .

Is AutoMapper bidirectional?

What is AutoMapper Reverse Mapping in C#? The Automapper Reverse Mapping is nothing but the two-way mapping which is also called as bidirectional mapping.

How do I ignore property in AutoMapper?

So, the AutoMapper Ignore() method is used when you want to completely ignore the property in the mapping. The ignored property could be in either the source or the destination object.


1 Answers

using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using NUnit.Framework;
using SharpTestsEx;

namespace StackOverflowExample.Automapper
{
    public class OrderViewModel
    {
        public string Name { get; set; }
        public string ContactDetails { get; set; }
        public List<FunkyThingViewModel> FunkyThingViewModels { get; set; }
    }

    public class FunkyThingViewModel
    {
        public string ThingName { get; set; }
        public string Colour { get; set; }
        public string Size { get; set; }
    }

    public class Order
    {
        public string Name { get; set; }
        public string ContactDetails { get; set; }
        public string ThingName { get; set; }
        public string Colour { get; set; }
        public string Size { get; set; }
    }

    [TestFixture]
    public class FlattenWithListTests
    {
        [Test]
        public void FlattenListTest()
        {
            //arrange
            var source = new OrderViewModel
                {
                    Name = "name",
                    ContactDetails = "contact",
                    FunkyThingViewModels = new List<FunkyThingViewModel>
                        {
                            new FunkyThingViewModel {Colour = "red"},
                            new FunkyThingViewModel {Colour = "blue"}
                        }
                };

            Mapper.CreateMap<FunkyThingViewModel, Order>();
            Mapper.CreateMap<OrderViewModel, Order>();
            Mapper.CreateMap<OrderViewModel, List<Order>>()
                  .ConvertUsing(om => om.FunkyThingViewModels.Select(
                      ftvm =>
                          {
                              var order = Mapper.Map<Order>(om);
                              Mapper.Map(ftvm, order);
                              return order;
                          }).ToList());

            //act
            var mapped = Mapper.Map<List<Order>>(source);

            //assert
            mapped[0].Satisfy(m =>
                              m.Name == source.Name &&
                              m.ContactDetails == source.ContactDetails &&
                              m.Colour == "red");
            mapped[1].Satisfy(m =>
                              m.Name == source.Name &&
                              m.ContactDetails == source.ContactDetails &&
                              m.Colour == "blue");
        }
    }
}
like image 115
Sunny Milenov Avatar answered Sep 22 '22 19:09

Sunny Milenov