我試圖將物件的串列映射到單個物件,并有一個嵌套的串列。
我有以下的類
我有以下的類
public class EventLog {
public string SystemId { get; set; }
public string UserId { get; set; }
public List<Event> Events { get; set; }
}
public class Event {
public string EventId { get; set; }
public string Message { get; set; }
}
public class EventDTO {
public string SystemId { get; set; }
public string UserId { get; set; }
public string EventId { get; set; }
public string Message { get; set; }
在我的List<EventDTO>中,SystemId和UserId對串列中的每個專案都是一樣的。
我想做的是完全相反的可能使用AutoMapper來映射一個物件到串列中的物件?.
。謝謝你!
uj5u.com熱心網友回復:
事實上,你的DTO可能包含不同的SystemIds和/或UserIds,你必須在創建分組物件之前按這個標準分組。一如既往,如果需要從另一型別的給定實體中用手揮出一個實體,AutoMapper中的捕獲所有方法是.ConvertUsing()并采取一個提供ResolutionContext的多載,以允許在方法本身中呼叫Map()方法。
在給出這個理論性的介紹之后,讓我們來看看一些解決你的問題的實際代碼:
public static class Program<
{
public static void Main(string[] args)
{
var dtos = new[ ] {
new EventDTO { SystemId = "1", UserId = "10", EventId = $"Event {Guid. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
new EventDTO { SystemId = "1", UserId = "20", EventId = $"Event {Guid.NewGuid()}. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
new EventDTO { SystemId = "1", UserId = "30", EventId = $"Event {Guid.NewGuid()}. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
new EventDTO { SystemId = "2", UserId = "10", EventId = $"Event {Guid.NewGuid()}. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
new EventDTO { SystemId = "2", UserId = "20", EventId = $"Event {Guid.NewGuid()}. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
new EventDTO { SystemId = "2", UserId = "30", EventId = $"Event {Guid.NewGuid()}. NewGuid()}", Message = $"Message {Guid.NewGuid()}" },
};
var config = new MapperConfiguration(conf => conf.AddProfile<EventMappingProfile> ())。
var mapper = config.CreateMapper()。
//必須要求串列,因為DTOs可能在SystemId和/或UserId上有所不同。
var logs = mapper.Map<List<EventLog>>(dtos)。
//將結果寫到控制臺。
foreach (var log in logs)
foreach (var ev in log.Events)
Console.WriteLine($"{log.SystemId} {log. UserId} {ev.EventId} {ev.Message}")。)
Console.ReadKey()。
}
}
public class EventMappingProfile : Profile
{
public EventMappingProfile()
{
CreateMap<EventDTO, Event>()。
CreateMap<IEnumerable<EventDTO>, IEnumerable<EventLog> >()
.ConvertUsing((dtos, _, context) =>
{
return dtos
.GroupBy(dto => (dto.SystemId, dto.UserId))
.Select(group => new EventLog
{
SystemId = group.Key.SystemId。
UserId = group.Key.UserId。
Events = group.Select(context.Mapper.Map< Event>).ToList()
})
.ToList();
});
}
}
uj5u.com熱心網友回復:
你將需要設定以下映射:
你將需要設定以下映射:
CreateMap<EventDTO, Event>()。
CreateMap<EventDTO, EventLog>()。
CreateMap<IEnumerable<EventDTO>, EventLog>()
.ForMember(dest => dest.SystemId, opt => opt.MapFrom(src => src.FirstOrDefault() != null ? src.First().SystemId : ")
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.FirstOrDefault() != null ? src.First().UserId : ")
.ForMember(dest => dest.Events, opt => opt.MapFrom(src => src))。
并呼叫下面的方法:
var eventLog = Mapper.Map<IEnumerable<EventDTO>, EventLog>(events)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307074.html
標籤:
上一篇:在哪里可以查看dev-tools上Javascript的JSON.parse()錯誤日志?
下一篇:C#Linq檢查給定的字串串列在Column(oldNumber和newNumber)中是否可用,并只回傳匹配的單元格值。
