2015-04-17 115 views
-1

我想向我的Repository添加一個方法,將給定的Generic類型映射到DTO。假設這些都是我EntityDTO如何在GenericRepository中使用Automapper將實體映射到DTO?

public class User : BaseEntity 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 

    List<UserOperation> operations { get; set; } 
} 

public class Operation : BaseEntity 
{ 
    public string src { get; set; } 
    public string title { get; set; } 
} 

public class UserOperation : BaseEntity 
{ 
    public int sortOrder { get; set; } 

    public Int64 userId { get; set; } 
    [JsonIgnore] 
    public virtual User user { get; set; } 

    public Int64 operationId { get; set; } 
    [JsonIgnore] 
    public virtual Operation operation { get; set; } 
} 

而且我希望有這樣的方法在GenericRepository

public interface IGenericRepository<T, Key> 
{ 
PagedResult<U> getAllGrid<U>(IQueryable<T> query, SearchOption option) where U : class; 
} 

public class GenericRepository<T, Key> : IGenericRepository<T, Key> where T : BaseEntity 
{ 
    public PagedResult<U> getAllGrid<U>(IQueryable<T> query, SearchOption option) where U : class 
      { 
        Mapper.CreateMap<T, U>(); 

        var totalRecordsCount = query.Count(); 

        if (totalRecordsCount != 0) 
        { 
         List<U> mappedEntities = new List<U>(); 
         foreach (T item in query.OrderBy(option.orderBy + " " + option.orderByType).Skip(option.start * option.size).Take(option.size)) 
         { 
          mappedEntities.Add(Mapper.Map<T, U>(item)); 
         } 

         return new PagedResult<U>() 
         { 
          Result = true, 
          Records = JsonConvert.SerializeObject(mappedEntities) 
         }; 
        } 
        else 
         return new PagedResult<U>() { Result = true, MainRecords = null }; 
      } 
} 

public class UserOperationRepository : GenericRepository<UserOperation, Int64>, IUserOperationRepository 
{ 
    public UserOperationRepository() 
    { 
     base.context = new AppContext(); 
    } 
    public PagedResult<UserOperationDTO> getAllGrid(long userId, SearchOption option) 
    { 
     var query = base.context.Set<UserOperation>().AsQueryable(); 

     return base.getAllGrid<UserOperationDTO>(query, option); 
    } 
} 

我是新來automapper和GenericRepository。

回答

1

AutoMapper支持投影 - 你不需要調用Mapper.Map:

var mappedEntities = query 
    .OrderBy(option.orderBy + " " + option.orderByType) 
    .Skip(option.start * option.size) 
    .Take(option.size) 
    .Project().To<U>() 
    .ToList(); 

我也聚集在一個地方,所有的CreateMap的 - CreateMap是昂貴的,並且只打算每個AppDomain調用一次。

相關問題