2015-07-12 45 views
0

我被告知要在下面的代碼中使用automapper。由於太長而無法理解的原因,我無法澄清。我應該映射什麼對象到什麼對象?我沒有看到「源」對象,因爲源是數據庫...如何在DTO上使用Automapper從EF返回?

真的很感謝任何關於如何使用automapper做到這一點的幫助。請注意,實際的字段是不相關的,我需要一般概念的幫助。我確實瞭解從一個對象映射到另一個對象時映射是如何工作的。

public IQueryable<Object> ReturnDetailedSummaries(long orgId) 
     { 
      var summaries = from s in db.ReportSummaries 
       where s.OrganizationId == orgId 
       select new SummaryViewModel 
       { 
        Id = s.Id, 
        Name = s.Name, 
        AuditLocationId = s.AuditLocationId, 
        AuditLocationName = s.Location.Name, 
        CreatedOn = s.CreatedOn, 
        CreatedById = s.CreatedById, 
        CreatedByName = s.User.Name, 
        OfficeId = s.OfficeId, 
        OfficeName = s.Office.Name, 
        OrganizationId = s.OrganizationId, 
        OrganizationName = s.Organization.Name, 
        IsCompleted = s.IsCompleted, 
        isHidden = s.isHidden, 
        numberOfItemsInAuditLocations = s.numberOfItemsInAuditLocations, 
        numberOfLocationsScanned = s.numberOfLocationsScanned, 
        numberOfItemsScanned = s.numberOfItemsScanned, 
        numberofDiscrepanciesFound = s.numberofDiscrepanciesFound 
       }; 
      return summaries; 
     } 

回答

2

這是一個方便和節省時間一個,特別是如果你使用一個轉換層之間的一個命名。這是我如何使用它。

對於單個項目

public Domain.Data.User GetUserByUserName(string userName) 
{ 
    Mapper.CreateMap<User, Domain.Data.User>(); 
    return (
     from s in _dataContext.Users 
     where s.UserName==userName 
     select Mapper.Map<User, Domain.Data.User>(s) 
    ).SingleOrDefault(); 
} 

多個項目

public List<Domain.Data.User> GetUsersByProvider(int providerID) 
{ 
    Mapper.CreateMap<User, Domain.Data.User>(); 
    return (
     from s in _dataContext.Users 
     where s.ProviderID== providerID 
     select Mapper.Map<User, Domain.Data.User>(s) 
    ).ToList(); 
} 
+0

謝謝,我會嘗試一下,然後回來接受答案。 – VSO

+2

不要在EF中使用'Mapper.Map',它將查詢比所需數據更多的數據,它基本上在EF表上執行'Select * from ...'。使用'Project.To (函數'而不是['AutoMapper.QueryableExtensions'](https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions)命名空間),它被設計爲與'IQueryable '對象,並且只會查詢映射中實際使用的列 –

+0

OP沒有聲明他使用的是EF,上面的例子使用LinqToSql, –

2

看起來你已經有一個模型? SummaryViewModel?

如果這不是DTO,那麼想必你想做的事:

Mapper.CreateMap<SummaryViewModel, SummaryViewModelDto>(); 

SummaryViewModelDto summaryViewModelDto = 
    Mapper.Map<SummaryViewModel, SummaryViewModelDto>(summaryViewModel); 

AutoMapper會從一個對象複製領域的另一個,以節省您不必手動做這一切。

https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

+0

「viewModel」是DTO,它不是整個表格的視圖模型。嘗試Irb的解決方案atm,看起來很乾淨。我很欣賞這個答覆。 – VSO

1

源是實體類ReportSummary,目標是SummaryViewModel

Mapper.CreateMap<ReportSummary, SummaryViewModel>(); 

組合使用AutoMapperIQueryable數據源的最佳方式是通過Project.To API

var summaries = db.ReportSummaries.Where(s => s.OrganizationId == orgId) 
        .Project().To<SummaryViewModel>(); 

Project.To將目標模型中的屬性直接轉換爲生成的SQL中的選定列。另一方面,

Mapper.Map另一方面,僅適用於內存集合,因此您只能在首次從數據庫中獲取完整對象時使用它。 (在這種情況下,可能沒有太大區別,但在其他情況下,它可能很大)。