2011-11-22 35 views
3

你好。我有一個看起來像這樣的列表:Automapper地圖定製收藏

public class PagedList<T> : List<T> 
{ 
    public PagedList(IEnumerable<T> collection) : base(collection) 
    { } 
    public int TotalItems { get; set; } 
    public int CurrentPage { get; set; } 
    public int PageSize { get; set; } 
    //some other properties 
} 

和庫用於尋呼

public PagedList<TEntity> GetPaged(int page) 
{ 
    var pagedEntities = some_query; 
    return pagedEntities.AsPagedList(totalResults, page, pageSize); 
} 

同樣PagedList在ASP MVC視圖模型也用於分頁。 是否可以使用Automapper將此集合與所有屬性TotalItems/CurrentPage/...進行映射?

PagedList<DbItem> dbItems = _repository.GetPages(page); 
    var viewItems = new PagedList<SomeItemView>(); 
    Mapper.Map(dbItems , viewItems); 

Tahnk你!

回答

4

這對我有效。你在尋找更通用的東西嗎?

public class DbItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ViewItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class PagedList<T>: List<T> 
{ 
    public int TotalItems { get; set; } 
    public int CurrentPage { get; set; } 
    public int PageSize { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MapItems(); 
    } 

    public static void MapItems() 
    { 
     Mapper.CreateMap<DbItem, ViewItem>(); 
     Mapper.CreateMap<PagedList<DbItem>, PagedList<ViewItem>>() 
      .AfterMap((s, d) => Mapper.Map<List<DbItem>, List<ViewItem>>(s, d)); 

     var dbList = new PagedList<DbItem> 
         { 
          new DbItem {Id = 1, Name = "a"}, 
          new DbItem {Id = 2, Name = "b"} 
         }; 
     dbList.TotalItems = 2; 
     dbList.CurrentPage = 1; 
     dbList.PageSize = 10; 
     var viewList = Mapper.Map<PagedList<DbItem>, PagedList<ViewItem>>(dbList); 

     Console.WriteLine(viewList.TotalItems); 
     Console.WriteLine(viewList.CurrentPage); 
     Console.WriteLine(viewList.PageSize); 
     Console.WriteLine(viewList[0].Id + " " + viewList[0].Name); 
     Console.WriteLine(viewList[1].Id + " " + viewList[1].Name); 
     Console.ReadLine(); 
    } 
} 
+0

謝謝主席先生。正是我需要的(: – shkipper

+0

你節省了我的一天 – tanathos

+0

很高興聽到:) – boca

2

你需要的是一個自定義類型轉換

public class PagedListConverter<TIn, TOut> : ITypeConverter<IPagedList<TIn>, IPagedList<TOut>> 
    { 
     public IPagedList<TOut> Convert(AutoMapper.ResolutionContext context) 
     { 

      var source = (IPagedList<TIn>)context.SourceValue; 

      var mapped = Mapper.Map<IList<TOut>>(source); 

      return new StaticPagedList<TOut>(mapped, source.GetMetaData()); 
     } 
    } 

用法:

Mapper.CreateMap<IPagedList<Company>, IPagedList<CompanyViewModel>>().ConvertUsing<PagedListConverter<Company, CompanyViewModel>>(); 
+0

您是否在新版本的Automapper中測試過? – Ehsan