So I had this issue at work had to install on xp machine, dont ask why but just had to 🙂 and the error was NET 4, Visual Studio 2010 install fails on XP SP3 machine “Fatal error during installation” Thus I was stuck installing Visual Studio 2010, I went and downloaded .net 4 standalone […]
Thanks to everyone who came out for the Ottawa .Net Community talk yesterday on WatiN , SpecFlow, BDD, WebDriver, I had a blast. I would like to thank everyone who came out for the talk. Here is my presentation WatiN – Web Application Testing on Prezi You can find the code on github https://github.com/taswar/ODNC-WatiN-And-SpecFlow-Demo-Code Additional […]
In this last part of the series I wanted to talk about how to register automapper at startup of your web application, in doing so it would help speed things up with automapper. There are many ways to do it, the easiest way is to just have a method inside Global.asax.cs file in your Application_Start […]
In this part I will show how we can use a customer value formatter (CustomFormatter) to format our mapped data into single “Number of Order:” and plural “Number of Orders:”. First the Domain and Dto (data transfer object)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Domain public class Order { public string OrderNo { get; set; } public Customer Customer { get; set; } public DateTime PurchaseDate { get; set; } public IEnumerable<OrderItems> LineItems { get; set; } public bool ShipToHomeAddress { get; set; } public decimal GetTotal() { return LineItems == null ? 0 : LineItems.Sum(x => x.GetTotalPrice()); } public Guid InternalId { get; set; } } //Dto public class NumberOfOrderDto { public string CustomerName { get; set; } public string NumberOfOrders { get; set; } } |
Now we will introduce a CustomResolver and Formatter, for the Formatter we are inheriting from IValueFormatter […]
In Part 5, we will use a powerful feature that automapper allows us, which is CustomResolver. Lets look at our Domain Object which contains a boolean field called ShipToHomeAddress, what we will do is map those boolean to a string value with “Yes” or “No”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Order { public string OrderNo { get; set; } public Customer Customer { get; set; } public DateTime PurchaseDate { get; set; } public IEnumerable<OrderItems> LineItems { get; set; } public bool ShipToHomeAddress { get; set; } public decimal GetTotal() { return LineItems == null ? 0 : LineItems.Sum(x => x.GetTotalPrice()); } public Guid InternalId { get; set; } } //DTO public class OrderShipDto { public string ShipHome { get; set; } public string CustomerName { get; set; } } |
For our mapping code we will introduce CustomResolver class […]
In Part 4 we will see how we can use projection to map inner objects for example a DateTime field. Again our domain and Dto (Data Transfer Object) looks like
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//Order public class Order { public string OrderNo { get; set; } public Customer Customer { get; set; } public DateTime PurchaseDate { get; set; } public IEnumerable<OrderItems> LineItems { get; set; } public bool ShipToHomeAddress { get; set; } public decimal GetTotal() { return LineItems == null ? 0 : LineItems.Sum(x => x.GetTotalPrice()); } public Guid InternalId { get; set; } } //Dto public class OrderDateDto { public int PurchaseHour { get; set; } public int PurchaseMinute { get; set; } public string CustomerName { get; set; } } |
We will map the PurchaseDate in the Domain Object to our Dto PurchaseHour and Purchase Minute.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public ActionResult OrderDate() { var order = _respository.Get(3); order.PurchaseDate = new DateTime(2011, 3, 15, 20, 30, 0); Mapper.CreateMap<Order, OrderDateDto>() .ForMember(dest => dest.PurchaseHour, opt => opt.MapFrom(src => src.PurchaseDate.Hour)) .ForMember(dest => dest.PurchaseMinute, opt => opt.MapFrom(src => src.PurchaseDate.Minute)); var model = Mapper.Map<Order, OrderDateDto>(order); return View(model); } //View <h2>OrderDate</h2> @Model.CustomerName @Model.PurchaseHour @Model.PurchaseMinute |
As you can see the View now […]
In this part we learn about Nested Mapping in Automapper and we will use the same OrderDto Object that we had previously but we will let Automapper to map the inner objects. Once again here is the Domain Objects First
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//Order public class Order { public string OrderNo { get; set; } public Customer Customer { get; set; } public DateTime PurchaseDate { get; set; } public IEnumerable<OrderItems> LineItems { get; set; } public bool ShipToHomeAddress { get; set; } public decimal GetTotal() { return LineItems == null ? 0 : LineItems.Sum(x => x.GetTotalPrice()); } public Guid InternalId { get; set; } } //OrderItems public class OrderItems { public decimal Price { get; set; } public string Name { get; set; } public int Quantity { get; set; } public decimal GetTotalPrice() { return Price * Quantity; } } |
The Dto (Data Transfer Object) look like
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class OrderDto { public string CustomerName { get; set; } public decimal Total { get; set; } public string OrderNumber { get; set; } public IEnumerable<OrderItemsDto> LineItems { get; set; } } //OrderItemsDto public class OrderItemsDto { public string Name { get; set; } public int Quantity { get; set; } public decimal Price { get; set; } } |
This time when we map Order […]
In this part I will be showing how Automapper uses flattening by convention. If we look at our OrderDto we will see that it has a IEnumerable of OrderItemsDto and also something called OrderNumber. This is the type of object we want to send to our presentation layer.
1 2 3 4 5 6 7 |
public class OrderDto { public string CustomerName { get; set; } public decimal Total { get; set; } public string OrderNumber { get; set; } public IEnumerable<OrderItemsDto> LineItems { get; set; } } |
Compare that to our domain object […]
Recently I gave a talk on Automapper in Ottawa .Net Community, so I though I would post the main ideas of the presentation here also. The demo was based on an Order System where there were just 3 tables/classes, “Order”, “Customer” and “OrderItems” From the diagram we can see that a Customer has a Bio […]
Operator ‘==’ cannot be applied to operands of type ‘System.Collections.Generic.KeyValuePair‘ and ‘‘
You are here beacause you probably got a Linq error, specifically Operator ‘==’ cannot be applied to operands of type ‘System.Collections.Generic.KeyValuePair‘ and ‘‘ So if you wish to do something like this to KeyValuePair using Linq
1 2 3 4 5 6 |
var item = myDictionary.FirstOrDefault(x => x.Key == 123); if(item != null) { //blah blah } |
You will get this error Operator ‘!=’ cannot be applied to operands of type ‘System.Collections.Generic.KeyValuePair‘ and ‘‘ Since […]