1

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

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 
                                        }

               };

但是,这不会编译!!!

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

我在做什么非常非常错误?

4

2 回答 2

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;其他变体抛出。)

我也同意迈克的观点,如果涉及单一关系,加入可能更符合您的要求。

于 2008-12-14T19:00:45.767 回答
1

你为什么要做一个连接和一个子选择?您可以只使用您加入的结果来创建一个新的场地。请注意,如果演出和场地之间没有一对一的关系,您可能会遇到麻烦。

尝试这个:

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 }
于 2008-12-14T16:53:07.820 回答