2015-01-20 2 views
0

AutoMapper를 사용하여 모델을 뷰 모델에 매핑해야합니다.오토 맵퍼 매핑 문제

모델 :

[Table("News")] 
public class News 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public DateTime DatePostedOn { get; set; } 
    public int Position { get; set; } 
    public Category Category { get; set; } 
    public virtual ICollection<Picture> Pictures { get; set; } 
} 

[Table("Pictures")] 
public class Picture 
{ 
    [Key] 
    public int Id { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Filename { get; set; } 
    public int Type { get; set; } 
    public virtual ICollection<News> News { get; set; } 
} 

뷰 모델 :

public class HomeViewModels 
{ 
    public IList<HomeMainNews> MainNews { get; private set; } 
} 

public class HomeMainNews 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Date { get; set; } 
    public string PictureURL { get; set; } 
} 

매핑 : 나는 단지 하나에 뷰 모델로, 그림의 집합이 뉴스를 매핑 할 수있는 방법

Mapper.CreateMap<News, HomeMainNews>(); 

특정 조건에 따른 그림 "Type = 2"

현재 솔루션 :

vm.MainNews = db.News 
       .Select(n => new HomeMainNews { 
           Id = n.Id, 
           Date = n.DatePostedOn.ToString(), 
           Title = n.Title, 
           PictureURL = n.Pictures.Where(p => p.Type == 1).Select(p => p.Filename).FirstOrDefault().ToString() 
         }).ToList(); 

Automapper 솔루션 :

vm.MainNews = db.News.Project().To<HomeMainNews>().ToList(); 
+1

시도 필드 중 하나에 사용자 정의 작업이 있습니다. 'HomeViewModels view = new HomeViewModels (MainNews = news.Select (Map))'를 사용하면된다. Map은 컨트롤러에 존재하는 메쏘드이고,이 세 가지 기본 필드와 네 번째 필드 주위의 로직을 매핑하는 HomeMainNews를 리턴한다. – wal

+0

안녕하세요, 감사합니다. 예제를 공유 할 수 있습니까? – Patrick

+0

무엇을 시도 했습니까? 나는 단지 당신을 위해 그것을하지 않고 예제를 제공하지 않습니다. 내 첫 코멘트에서 기본 구조를 부여했습니다. – wal

답변

2

나는이 특히 경우에 대한 Automapper를 사용하지 것이다 (당신의 VM에서 4 개 필드) 너무 간단 뭔가를이

Mapper.CreateMap<News, HomeMainNews>() 
      .ForMember(mainNew => mainNew.Date, opt => opt.MapFrom(news => news.DatePostedOn)) 
      .ForMember(mainNew => mainNew.PictureURL, opt => opt.MapFrom(news => news.Pictures.First(pic => pic.Type == 2).Filename)); 
+0

안녕하세요. 시도해 보겠습니다 ... – Patrick

+0

잘 작동합니다! 큰! 내 Linq 쿼리에 관한 성능은 어떻습니까? – Patrick

+0

SQL을 확인하십시오. LINQ와별로 다르지 않을 것입니다. –