在 Web Api get 方法中将 Automapper 与 LINQ 结合使用

using Automapper with LINQ in Web Api get method

我有一个小网站Api方法。如何使用 Automapper 映射 GetBooks 方法中的属性?我已经尝试了解决方案 here

我试过了

 return from c in db.Books select Mapper.Map<BookDTO>(c);

但是没有用。 这是我的完整代码;

     //GET: api/Books
      public IQueryable<BookDTO> GetBooks()
      {
        var books = from b in db.Books
                    select new BookDTO()
                    {
                        Id = b.Id,
                        Title = b.Title,
                        AuthorName = b.Author.Name
                    };

        return books;
    }

Book.cs

 public class Book
{
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    public int Year { get; set; }
    public decimal Price { get; set; }
    public string Genre { get; set; }

    // Foreign Key
    public int AuthorId { get; set; }
    // Navigation property
    public Author Author { get; set; }
}

BookDTO.cs

 public class BookDTO
   {
    public int Id { get; set; }
    public string Title { get; set; }
    public string AuthorName { get; set; }
   }

提前致谢。

  1. Global.asax.cs[=31=中BookBookDTO之间配置映射] 文件:

    Mapper.CreateMap<Book, BookDTO>();
    
  2. GetBooks() 方法中映射 db.Books

    using AutoMapper.QueryableExtensions;
    
    ...
    
    public IQueryable<BookDTO> GetBooks()
    {
        return db.Books.ProjectTo<BookDTO>();
    }
    

你需要投影。参见 Automapper - Projection

Mapper.CreateMap<Book, BookDTO>()
    .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
    .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title))
    .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name));

IEnumerable<Book> books = db.Books.Cast<Book>();
// assuming Books implements IEnumerable
BookDTO result = Mapper.Map<Book, BookDTO> books;

我不确定您是否需要属性 Id 和 Title 的投影线。阅读 AutoMapper 的文档以了解它使用的默认值。