Linq到SQL和自动映射器
本文关键字:映射 SQL Linq | 更新日期: 2023-09-27 18:00:29
我设置了以下
- Linq到SQL数据上下文
- 我用来将数据从业务层传递到UI的数据传输对象(DTO)
我的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();
有没有一种方法可以让我使用自动映射器来进行映射?
当我必须使用大量的投影、分组和条件来填充一个DTO时,我使用数据库视图并在视图中执行这些任务。这将消除使用对象映射工具的复杂性,并且您的数据上下文将返回可供使用的对象
在LINQ Projector项目上扩展@kgolovchenko答案,看起来AutoMapper最近添加了此功能。
var model = entites.Query().To<EntityModel>()
.Where(m => m.Name.StartsWith("One"))
.First();
我假设您的意思是将db对象映射到CustomerEventDto
对象,对吧?
简短回答:是的,应该是可能的。
更长的答案:是的,你应该能够使用AutoMapper进行这些转换,只是我认为设置会有点复杂。也许它会开箱即用。。。
嗯,我写了一个小代码示例,但在写它的时候,我意识到它可能不会像看起来那么容易,因为你想把几个DB对象投影到1个CustomerEventDto
对象中。我认为复杂的设置可能不值得麻烦。。。
所以我现在的结论是,这是不可能的。如果你或其他人确实找到了解决方案,请发布它,这样我将来也可以使用这种技术!
对不起,我不能再帮你了。
看看LINQ投影仪。它正是你想要的。据我所知,AutoMapper不能与LINQ表达式一起使用。