如何在EF返回的DTO上使用Automapper?

时间:2015-07-12 05:02:22

标签: entity-framework automapper

我被告知在下面的代码中使用了automapper。由于太长而无法解决的原因,我无法澄清。我应该将什么对象映射到哪个对象?我没有看到“源”对象,因为源是数据库...

非常感谢有关如何使用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; 
        }

3 个答案:

答案 0 :(得分:3)

这是一个方便和节省时间,特别是如果您在翻译层之间使用一对一命名。这是我如何使用它。

单项

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();  
}

答案 1 :(得分:2)

看起来你已经有了模特? SummaryViewModel?

如果这不是DTO,那么大概是你想做的事:

Mapper.CreateMap<SummaryViewModel, SummaryViewModelDto>();

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

AutoMapper会将字段从一个对象复制到另一个对象,以免您必须手动完成所有操作。

请参阅https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

答案 2 :(得分: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仅适用于内存中的集合,因此您只能在首次从数据库中获取完整的ReportSummary对象时使用它。 (在这种情况下,可能没有太大的区别,但在其他情况下,它可能是实质性的)。