Automapper映射问题
问题描述:
我需要使用AutoMapper将模型映射到视图模型。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();
答
试试这个
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));
对于这么简单的东西(4场在你的虚拟机),我不会为此特别是如果使用Automapper其中一个领域有一些定制工作。你可以简单地使用'HomeViewModels view = new HomeViewModels(MainNews = news.Select(Map))'其中Map是一个驻留在控制器中的方法,返回映射这3个基本字段和第4个字段周围逻辑的HomeMainNews。 – wal 2015-01-20 23:47:38
嗨,谢谢。你能分享一个例子吗? – Patrick 2015-01-21 00:21:25
你试过了什么?我不能仅仅为你提供一个例子。我在第一条评论中给出了基本结构 – wal 2015-01-21 00:33:26