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

有没有一种方法可以让我使用自动映射器来进行映射?

Linq到SQL和自动映射器

当我必须使用大量的投影、分组和条件来填充一个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表达式一起使用。