2016-02-19 74 views
0

我有一個小的Web Api方法。如何將GetBooks方法中的屬性與Automapper進行映射?我已經嘗試瞭解決方案here在Web Api中使用帶有LINQ的Automapper獲取方法

我已經試過

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

「但不成功」不是對問題的描述。 –

+0

你說得對。我很着急,這就是我爲什麼這樣寫的。我的意思是我嘗試了我給出的鏈接上的方法。它沒有工作。我將這個代碼實施到我的。從上下文中的c返回。客戶 選擇Mapper.Map (c); – oneNiceFriend

回答

2
  1. 配置BookBookDTO之間地圖在Global.asax.cs中Startup.cs文件:

    Mapper.CreateMap<Book, BookDTO>(); 
    
  2. 地圖db.BooksGetBooks()方法:

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

是的,它的工作,真的很棒。你知道Automapper如何知道BookDTO.AuthorName是Book.Author.Name嗎? – oneNiceFriend

+0

@OneNic​​eFriend:如果對於目標類型上的任何屬性,源類型中不存在屬性,則AutoMapper會將目標成員名稱拆分爲單個單詞(按PascalCase約定),該鏈接將更好地解釋它:https://github.com/AutoMapper/AutoMapper /維基/壓扁 –

1

你需要投影。請參閱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和標題的投影線。閱讀AutoMapper的文檔以查看它使用的默認值。