Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map collection of objects

I am trying to introduce Automapper into an application for the first time, but I keep getting an error saying I have some invalid arguments.

My model:

namespace StoreGradesLib.Models {     public class Store     {         [Key]         public int StoreID { get; set; }          [Required]         [MaxLength(120)]         public string StoreName { get; set; }          [Required]         [MaxLength(20)]         public string StoreNumber { get; set; }          [Required]         [MaxLength(120)]         public string ManagerName { get; set; }          [Required]         public long PhoneNumber { get; set; }          [Required]         public string AddressLine1 { get; set; }          public string AddressLine2 { get; set; }          [Required]         public string Postcode { get; set; }          [Required]         public int WallArea { get; set; }          [Required]         public int FloorArea { get; set; }          [Required]         public int NumWindows { get; set; }          [Required]         public int NumDesks { get; set; }          [Required]         public int NumDoors { get; set; }          [Required]         public int StoreGradeID { get; set; }          [Required]         public bool Active { get; set; }          public virtual StoreGrade StoreGrade { get; set; }          [Timestamp]         public Byte[] Timestamp { get; set; }     } } 

My View Model:

namespace StoreGradesLib.ViewModels {     public class StoreVM     {         public int StoreID { get; set; }         public bool Active { get; set; }         public Byte[] Timestamp { get; set; }          [Required(ErrorMessage = "Store Name is required.")]         [Display(Name = "Store Name")]         public string StoreName { get; set; }          [Required(ErrorMessage = "Store Number is required")]         public string StoreNumber { get; set; }          [Required(ErrorMessage = "Store Manager is required.")]         [Display(Name = "Manager Name")]         public string ManagerName { get; set; }          [Required(ErrorMessage = "Contact Number is required.")]         [Display(Name = "Phone Number")]         public int PhoneNumber { get; set; }          [Required(ErrorMessage = "Address Line 1 is required.")]         [Display(Name = "Address Line 1")]         public string AddressLine1 { get; set; }          [Display(Name = "Address Line 2")]         public string AddressLine2 { get; set; }          [Required(ErrorMessage = "Postcode is required.")]         public string Postcode { get; set; }          [Required(ErrorMessage = "Must input wall area.")]         [Display(Name = "Wall Area")]         public int WallArea { get; set; }          [Required(ErrorMessage = "Must input floor area.")]         [Display(Name = "Floor Area")]         public int FloorArea { get; set; }          [Required(ErrorMessage = "Must input number of windows.")]         [Display(Name = "Windows")]         public int NumWindows { get; set; }          [Required(ErrorMessage = "Must input number of desks.")]         [Display(Name = "Desks")]         public int NumDesks { get; set; }          [Required(ErrorMessage = "Must input number of doors.")]         [Display(Name = "Doors")]         public int NumDoors { get; set; }          [Required(ErrorMessage = "Store must have a grade.")]         public StoreGrade StoreGradeID { get; set; }          public string Address         {             get             {                 return StoreName + " " + AddressLine1 + " " + AddressLine2 + " " +                 Postcode;             }         }     } } 

Created mappings:

CreateMap<Store, StoreVM>(); CreateMap<StoreVM, Store>(); 

Within my controller, I am trying to map a selection of stores to storeVM. I am currently getting my stores as so;

var stores = db.Store.Include(s => s.StoreGrade); stores = from s in db.Store.Where(s => s.Active.Equals(true))                  select s; 

I am wanting to map the selection of stores to StoreVM, I have tried the following, but i get an invalid parameters warning,

var VMstores = Mapper.Map<Store, StoreVM>(stores); 

I am receiving the error that the best overloaded method match has some invalid arguments.

Can anyone point me in the right direction?

like image 576
Riddick Avatar asked Dec 03 '12 16:12

Riddick


People also ask

What are Map collections?

A Map is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value. It models the mathematical function abstraction.

What is the use of Map collection?

Map is a collection of key-value pairs where the key can be of any type. Map remembers the original order in which the elements were added to it, which means data can be retrieved in the same order it was inserted in.

Is a Map a type of collection?

Because a Map is not a true collection, its characteristics and behaviors are different than the other collections like List or Set. A Map cannot contain duplicate keys and each key can map to at most one value.

What is an object Map?

An object map is a test asset that contains items that associate a logical name (an alias) with a control or a window, rather than the control or window's locator. Once a control is registered in an object map asset, all references to it in scripts are made by its alias, rather than by its actual locator name.


2 Answers

You are mapping collections, not single entities (IEnumerable<Store> to IEnumerable<StoreVM>), so use this mapping

var VMstores = Mapper.Map<IEnumerable<Store>, IEnumerable<StoreVM>>(stores); 
like image 160
Sergey Berezovskiy Avatar answered Sep 28 '22 02:09

Sergey Berezovskiy


Update! Now you can do this:

var VMstores = stores.Project().To<StoreVM>(); 
like image 25
Danilo Breda Avatar answered Sep 28 '22 02:09

Danilo Breda