将Linq Entity对象调整为Domain对象

时间:2008-12-14 16:34:27

标签: asp.net-mvc linq dns adaption

我有以下代码使linq实体适应我的Domain对象:

return from g in DBContext.Gigs
               select new DO.Gig
               {
                   ID = g.ID,
                   Name = g.Name,
                   Description  = g.Description,
                   StartDate    = g.Date,
                   EndDate      = g.EndDate,
                   IsDeleted    = g.IsDeleted,
                   Created      = g.Created,
                   TicketPrice  = g.TicketPrice

               };

这很好用。

但是我现在想要填充域对象Venue对象并将其添加到同一语句中的gig中。继承人我的尝试......

return from g in DBContext.Gigs
               join venue in DBContext.Venues on g.VenueID equals venue.ID
               select new DO.Gig
               {
                   ID = g.ID,
                   Name = g.Name,
                   Description  = g.Description,
                   StartDate    = g.Date,
                   EndDate      = g.EndDate,
                   IsDeleted    = g.IsDeleted,
                   Created      = g.Created,
                   TicketPrice  = g.TicketPrice,
                   Venue        =     from v in DBContext.Venues
                                        where v.ID == g.VenueID
                                        select new DO.Venue
                                        {
                                            ID           = v.ID,
                                            Name         = v.Name,
                                            Address      = v.Address,
                                            Telephone    = v.Telephone,
                                            URL          = v.Website 
                                        }

               };

然而这并没有编译!!!

是否可以使用“选择新”方法调整儿童对象?

我在做什么这么非常错?

2 个答案:

答案 0 :(得分:2)

您的内部LINQ查询返回多个对象,而不仅仅是一个。你想用以下的调用来包装它:

Venue = (from v in DBContext.Venues
         where v.ID == g.VenueID
         select new DO.Venue
         {
             ID           = v.ID,
             Name         = v.Name,
             Address      = v.Address,
             Telephone    = v.Telephone,
             URL          = v.Website 
         }).SingleOrDefault()

您选择的Single()与SingleOrDefault()与First()与FirstOrDefault()的关系取决于它是什么类型的查询,但我猜你想要前两个中的一个。 (如果查询没有数据,则“OrDefault”变量返回null;其他变量返回。)

我同意迈克的看法,如果涉及到一个单一的关系,那么加入可能更符合你的想法。

答案 1 :(得分:1)

为什么要进行加入和子选择?您可以在创建新Venue时使用您的联接结果。请注意,如果演出和场地之间没有一对一的关系,您可能会遇到麻烦。

试试这个:

return from g in DBContext.Gigs 
    join venue in DBContext.Venues on g.VenueID equals venue.ID 
    select new DO.Gig { ID = g.ID, Name = g.Name, Description = g.Description,
        StartDate = g.Date, EndDate = g.EndDate, IsDeleted = g.IsDeleted, 
        Created = g.Created, TicketPrice = g.TicketPrice, 
        Venue = new DO.Venue { ID = venue.ID, Name = venue.Name, 
            Address = venue.Address, Telephone = v.Telephone, 
            URL = v.Website }