我有以下设置
我的DTO的典型用途是从我的数据库连接表,以便我可以将包含连接结果的一个数据对象传递给我的UI。
我的代码与此类似(这与在SO中发布的实际代码相比大大减少了......)
IQueryable<CustomerEventDto> query = (
from ce in db.CustomerEvents
join cet in db.CustomerEventTypes on ce.CustomerEventTypeId equals cet.CustomerEventTypeId
join c in db.Customers on ce.PidCreating equals c.Pid
join c in db.Countries on ce.CountryId equals c.CountryId
join t in db.TimeZones on ce.TimeZoneId equals t.TimeZoneId
where ce.Pid == pid
select new CustomerEventDto()
{
ApprovedHR = ce.ApprovedHR,
City = ce.City,
Closed = ce.Closed,
CountryId = ce.CountryId,
CountryCode = c.CodeISO3166Alpha2,
CreatorForename = c.CustomersUnique.Forename,
CreatorSurname = c.CustomersUnique.Surname,
CreatorUsername = c.UserName,
Email = ce.Email,
EventDateTime = ce.DateTime,
EventType = ce.CustomerEventTypeId,
EventTypeDescription = cet.Detail,
LockedOutSecurity = ce.LockedOutSecurity,
LockedOutSuspension = ce.LockedOutSuspension,
TimeZoneDifference = t.Difference,
TimeZoneId = ce.TimeZoneId,
TimeZoneName = t.ZoneName
});
query = query
.OptionalWhere(from, ce => (ce.EventDateTime >= from.StartOfDayNullable()))
.OptionalWhere(to, ce => (ce.EventDateTime <= to.StartOfDayNullable()))
.OptionalWhere(eventType, ce => (ce.EventType == eventType));
return query.ToList();
有没有办法可以使用Auto Mapper进行此映射?
答案 0 :(得分:2)
当我必须使用大量的投影,分组和条件来填充一个DTO我使用数据库视图并在视图中执行这些任务。这将消除使用对象映射工具的复杂性,并且您的datacontext将返回准备使用的对象
答案 1 :(得分:1)
在LINQ Projector project上扩展@kgolovchenko答案,看起来AutoMapper最近添加了此功能。
var model = entites.Query().To<EntityModel>()
.Where(m => m.Name.StartsWith("One"))
.First();
答案 2 :(得分:0)
我假设您的意思是将db对象映射到CustomerEventDto
对象吗?
简短回答:是的,应该是可能的。
更长的回答:是的,您应该可以使用AutoMapper进行这些转换,我认为只有设置会有点复杂。也许它可以开箱即用......
嗯,我正在写一个小代码示例,但在编写它时我意识到它可能不会那么容易,因为你想将几个DB对象投影到1CustomerEventDto
个对象。我认为复杂的设置可能不值得麻烦...
所以我现在的结论是,这是不可能的。如果您或其他任何人确实找到了解决方案,请将其发布,以便将来也可以使用此技术!
很抱歉,我无法提供任何帮助。
答案 3 :(得分:0)
看看LINQ Projector。它完全符合你的要求。据我所知,AutoMapper不能与LINQ表达式一起使用。