如何在 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);
AutoMapper 会将字段从一个对象复制到另一个对象,从而避免您手动完成所有操作。
见https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
源是你的实体classReportSummary
,目标是SummaryViewModel
:
Mapper.CreateMap<ReportSummary, SummaryViewModel>();
将 AutoMapper
与 IQueryable
数据源结合使用的最佳方式是通过 Project.To
API:
var summaries = db.ReportSummaries.Where(s => s.OrganizationId == orgId)
.Project().To<SummaryViewModel>();
Project.To
将目标模型中的属性直接转换为生成的 SQL.
中的选定列
另一方面,Mapper.Map
仅适用于内存中的集合,因此您只能在首次从数据库中获取完整的 ReportSummary
对象时使用它。 (在这种情况下可能没有太大区别,但在其他情况下可能会很大)。
有人告诉我在下面的代码中使用自动映射器。由于太长的原因,我无法得到澄清。我应该将什么对象映射到什么对象?我没有看到 "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);
AutoMapper 会将字段从一个对象复制到另一个对象,从而避免您手动完成所有操作。
见https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
源是你的实体classReportSummary
,目标是SummaryViewModel
:
Mapper.CreateMap<ReportSummary, SummaryViewModel>();
将 AutoMapper
与 IQueryable
数据源结合使用的最佳方式是通过 Project.To
API:
var summaries = db.ReportSummaries.Where(s => s.OrganizationId == orgId)
.Project().To<SummaryViewModel>();
Project.To
将目标模型中的属性直接转换为生成的 SQL.
Mapper.Map
仅适用于内存中的集合,因此您只能在首次从数据库中获取完整的 ReportSummary
对象时使用它。 (在这种情况下可能没有太大区别,但在其他情况下可能会很大)。