独自の変換設定

先ほどは命名に沿ったシンプルな詰め替えを行いました。続けて、特別なルールを設定するケースについて見ていきましょう。まず、詰め替え先となるBookView2クラスを記述します。

BookView2クラスを定義

public class BookView2
{
  public int ID { get; set; }                //書籍のID
  public string Name { get; set; }           //書籍の名前
  public int PubdateYear { get; set; }       //書籍の出版年(数値)
  public string AuthorAge { get; set; }      //著者の年齢(文字列)
  public string AuthorFullName { get; set; } //著者の氏名(文字列)
}

特別なマッピングを行うには、CreateMapメソッドにてマッピング定義を行います。ここでは、PubdateYear、AuthorAge、AuthorFullNameプロパティに対してデフォルトとは異なる設定を行います。

BookからBookView2への詰め替え

public ActionResult Details2(int id)
{
  //Linq to SQLでBookエンティティを取得
  Book book = (from b in db.Book where b.ID == id select b).First();

  //マッピング方法を設定
  Mapper.CreateMap<Book, BookView2>()
    .ForMember(view => view.PubdateYear, //(1)PubdateYearに年度を設定
               option => option.MapFrom(entity => entity.Pubdate.Year))
    .ForMember(view => view.AuthorAge,   //(2)AuthorAgeに年齢はコピーしない
               option => option.Ignore());

  //BookからBookView2への詰め替えを実施
  BookView2 bookView = Mapper.Map<Book, BookView2>(book);
  return View(bookView);
}


// 以下はAuthorのパーシャルクラス
public partial class Author 
{ //(3)名字と名前をくっつけるGetFullNameメソッド
  public string GetFullName()
  {
    return LastName + " " + FirstName;
  }
}

(1)のPubdateYearプロパティでは、出版日から年のみを抽出しています。CreateMapメソッドにて「ForMember(コピー先変数名 => コピー先変数名.対象プロパティ,option => option.MapFrom(コピー元変数名 => 設定式))」と記述することで、任意の値を設定することができます。

(2)のAuthorAgeプロパティでは、年齢のマッピングを無効にしています。CreateMapメソッドにて「option => option.Ignore())」と記述することで、値をコピーしないようにできます。

(3)のAuthorクラスのGetFullNameメソッドでは、著者の姓と名を結合しています。このメソッドは、BookView2クラスのAuthorFullNameプロパティに対応します。AutoMapperはメンバ名からGetを取り除いてマッチングする点に注意してください。

コレクションを使った複数レコードのコピー

ここまで、オブジェクトを1つだけコピーする方法を見てきましたが、複数のオブジェクトをコピーすることもできます。AutoMapperは「IEnumerable」「ICollection」「IList」「List」「配列」のコピーをサポートしています。

コレクションのコピー

//LINQ to SQLで複数のBookを取得
List<Book> books = (from b in db.Book select b).ToList();

//マッピング方法を設定(CreateMapでクラスを指定。Listでない点に注目)
Mapper.CreateMap<Book, BookView>();

//BookからBookViewへの詰め替えを実施(MapはListである点に注目)
List<BookView> bookViewList = 
    Mapper.Map<List<Book>, List<BookView>>(books);

ここではList型のコレクションをまとめてコピーしています。CreateMapメソッドでは型を指定しますが、Mapメソッドではコレクション型を指定している点に注意してください。