簡體   English   中英

AutoMapper投影-日期/時間

[英]AutoMapper Projection - date/time

我的實體中有一個DateTime字段,它需要映射到ViewModel中的2個單獨的字段以獲取日期和時間,即

// Entity
  public partial class Event
    {
        public Int64 Id { get; set; }
        public String Title { get; set; }
        public DateTime StartDateTime { get; set; }
        public DateTime EndDateTime { get; set; }
    }

// ViewModel
public class EventAddEditViewModel
    {
        public Int64 Id { get; set; }
        public String Title { get; set; }
        public String StartDate { get; set; }
        public String EndDate { get; set; }
        public String StartTime { get; set; }
        public String EndTime { get; set; }
    }

這個例子 ,我有以下映射:

    Mapper.CreateMap<Event, EventAddEditViewModel>()
            .ForMember(dest => dest.StartDate, opt => opt.MapFrom(src => src.StartDateTime.Date))
            .ForMember(dest => dest.StartTime, opt => opt.MapFrom(src => src.StartDateTime.TimeOfDay))
            .ForMember(dest => dest.EndDate, opt => opt.MapFrom(src => src.EndDateTime.Date))
            .ForMember(dest => dest.EndTime, opt => opt.MapFrom(src => src.EndDateTime.TimeOfDay));

太好了 但是,如何反轉映射,即Mapper.CreateMap(),以便它也可以在表單發布時進行映射?

我做過類似的事情,但是我在ViewModel上將StartDateTime作為DateTime屬性,並為Hours和Minutes提供了兩個int屬性,例如

// ViewModel
public class EventAddEditViewModel
{
    public Int64 Id { get; set; }
    public String Title { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public int StartHour { get; set; }
    public int EndHour { get; set; }
    public int StartMinute { get; set; }
    public int EndMinute { get; set; }
}

這意味着我可以進行映射

Mapper.CreateMap<Event, EventAddEditViewModel>()
    .ForMember(dest => dest.StartDate, opt => opt.MapFrom(src => src.StartDateTime.Date))
    .ForMember(dest => dest.StartHour, opt => opt.MapFrom(src => src.StartDateTime.Hour))
    .ForMember(dest => dest.StartMinute, opt => opt.MapFrom(src => src.StartDateTime.Minute))
    .ForMember(dest => dest.EndDate, opt => opt.MapFrom(src => src.StartDateTime.Date))
    .ForMember(dest => dest.EndHour, opt => opt.MapFrom(src => src.EndDateTime.Hour))
    .ForMember(dest => dest.EndMinute, opt => opt.MapFrom(src => src.StartDateTime.Minute));

Mapper.CreateMap<EventAddEditViewModel, Event>()
    .ForMember(dest => dest.StartDateTime, opt => opt.MapFrom(src => new DateTime(src.StartDate.Year, src.StartDate.Month, src.StartDate.Day, src.StartHour, src.StartMinute, 0)))
    .ForMember(dest => dest.EndDateTime, opt => opt.MapFrom(src => new DateTime(src.EndDate.Year, src.EndDate.Month, src.EndDate.Day, src.EndHour, src.EndMinute, 0)));

您應該考慮沿着這些行更改viewmodel屬性,因為整數將更易於使用,但是,如果它們必須是字符串,則需要一種從字符串中解析出DateTime對象的方法。 根據字符串的格式,應該遵循以下幾條原則

Mapper.CreateMap<EventAddEditViewModel, Event>()
    .ForMember(dest => dest.StartDateTime, opt => opt.MapFrom(src => DateTime.Parse( src.StartDate + " " + src.StartTime)))
    .ForMember(dest => dest.EndDateTime, opt => opt.MapFrom(src => DateTime.Parse(src.EndDate + " " + src.EndTime)));

@StanK,在這種情況下,我具有更簡單的映射語法:

Mapper.CreateMap<EventAddEditViewModel, Event>()
    .ForMember(dest => dest.StartDateTime, opt => opt.MapFrom(src => src.StartDate.Add(src.StartTime.TimeOfDay)))
    .ForMember(dest => dest.EndDateTime, opt => opt.MapFrom(src => src.EndDate.Add(src.EndTime.TimeOfDay)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM