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

How to Use Automapper on DTO Returned From EF?

有人告诉我在下面的代码中使用自动映射器。由于太长的原因,我无法得到澄清。我应该将什么对象映射到什么对象?我没有看到 "source" 对象,因为源是数据库...

非常感谢有关如何使用自动映射器执行此操作的任何帮助。请注意,实际字段无关紧要,我需要有关一般概念的帮助。当从一个对象映射到另一个对象时,我确实了解映射的工作原理。

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

它既方便又省时,尤其是当您在翻译层之间使用一对一命名时。下面是我的使用方法。

单件商品

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

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

如果这不是 DTO,那么您可能想要这样做:

Mapper.CreateMap<SummaryViewModel, SummaryViewModelDto>();

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

A​​utoMapper 会将字段从一个对象复制到另一个对象,从而避免您手动完成所有操作。

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

源是你的实体classReportSummary,目标是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 对象时使用它。 (在这种情况下可能没有太大区别,但在其他情况下可能会很大)。