Ronald McDonald
Ronald McDonald

Reputation: 2911

transfer DTO to ViewModel

Here is my data transfer object

public class LoadSourceDetail
{
  public string LoadSourceCode { get; set; }
  public string LoadSourceDesc { get; set; }
  public IEnumerable<ReportingEntityDetail> ReportingEntity { get; set; }
}

public class ReportingEntityDetail
{
  public string ReportingEntityCode { get; set; }
  public string ReportingEntityDesc { get; set; }
}

And here is my ViewModel

public class LoadSourceViewModel
{
    #region Construction

        public LoadSourceViewModel ()
        {
        }

        public LoadSourceViewModel(LoadSourceDetail data)
        {
            if (data != null)
            {
                LoadSourceCode = data.LoadSourceCode;
                LoadSourceDesc = data.LoadSourceDesc;
                ReportingEntity = // <-- ?  not sure how to do this 
            };
        }


    #endregion
    public string LoadSourceCode { get; set; }  
    public string LoadSourceDesc { get; set; }
    public IEnumerable<ReportingEntityViewModel> ReportingEntity { get; set; }  
}

public class ReportingEntityViewModel 
{ 
    public string ReportingEntityCode { get; set; }
    public string ReportingEntityDesc { get; set; } 
}

}

I'm not sure how to transfer the data from the LoadSourceDetail ReportingEntity to the LoadSourceViewModel ReportingEntity. I'm trying to transfer data from one IEnumerable to another IEnumerable.

Upvotes: 3

Views: 1547

Answers (3)

Amitd
Amitd

Reputation: 4849

Without AutoMapper you will have to map each property one by one ,

Something like this :

  LoadSourceDetail obj = FillLoadSourceDetail ();// fill from source or somewhere

     // check for null before
    ReportingEntity = obj.ReportingEntity
                     .Select(x => new ReportingEntityViewModel() 
                        { 
                           ReportingEntityCode  = x.ReportingEntityCode,
                           ReportingEntityDesc  x.ReportingEntityDesc
                         })
                     .ToList(); // here is  'x' is of type ReportingEntityDetail

Upvotes: 1

hutchonoid
hutchonoid

Reputation: 33306

I would use AutoMapper to do this:

https://github.com/AutoMapper/AutoMapper

http://automapper.org/

You can easily map collections, see https://github.com/AutoMapper/AutoMapper/wiki/Lists-and-arrays

It would look something like this:

var viewLoadSources = Mapper.Map<IEnumerable<LoadSourceDetail>, IEnumerable<LoadSourceViewModel>>(loadSources);

If you are using this in an MVC project I usually have an AutoMapper config in the App_Start that sets the configuration i.e. fields that do not match etc.

Upvotes: 6

Andomar
Andomar

Reputation: 238078

You could point it to the same IEnumerable:

ReportingEntity = data.ReportingEntity;

If you want to make a deep copy, you could use ToList(), or ToArray():

ReportingEntity = data.ReportingEntity.ToList();

That will materialize the IEnumerable and store a snapshot in your view model.

Upvotes: 0

Related Questions