在 Web Api get 方法中使用 Automapper 和 LINQ

本文关键字:Automapper LINQ Web Api get 方法 | 更新日期: 2023-09-27 18:35:32

我有一个小的Web Api方法。如何使用自动映射器映射 GetBooks 方法中的属性?我已经在这里尝试了解决方案.

我试过了

 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;
    }

书.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; }
}

书东.cs

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

提前谢谢。

在 Web Api get 方法中使用 Automapper 和 LINQ

  1. Global.asaxStartup.cs 文件中 BookBookDTO 之间的配置映射.cs:

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

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

你需要投影。请参阅自动映射器 - 投影

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 和标题的投影线。阅读自动映射器的文档,了解它使用的默认值。