2015-04-17 6 views
-1

Я хочу добавить метод в свой репозиторий, который сопоставляет данный тип Generic с DTO. Предположим, что это мой Entity и DTO:Как использовать Automapper внутри GenericRepository для создания объектов в 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 ,

Смежные вопросы