Linq to SQL和Auto Mapper

时间:2011-06-28 08:42:22

标签: c# linq-to-sql automapper

我有以下设置

  • Linq to SQL data context
  • 我用来将数据从我的业务层传递到我的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();

有没有办法可以使用Auto Mapper进行此映射?

4 个答案:

答案 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对象投影到1 CustomerEventDto个对象。我认为复杂的设置可能不值得麻烦...

所以我现在的结论是,这是不可能的。如果您或其他任何人确实找到了解决方案,请将其发布,以便将来也可以使用此技术!

很抱歉,我无法提供任何帮助。

答案 3 :(得分:0)

看看LINQ Projector。它完全符合你的要求。据我所知,AutoMapper不能与LINQ表达式一起使用。