2015-07-12 46 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另一方面,仅适用于内存集合,因此您只能在首次从数据库中获取完整对象时使用它。 (在这种情况下,可能没有太大区别,但在其他情况下,它可能很大)。