Адаптация объектов Linq Entity к объектам домена

У меня есть следующий код, который адаптирует объекты 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 объекта домена и добавить его в концерт в том же заявлении. Вот моя попытка ....

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 
                                        }

               };

Однако это не компилируется !!!

Можно ли адаптировать дочерние объекты, используя подход «выбрать новый»?

Что я так делаю очень-очень неправильно?

14.12.2008 16:34:26
Это я или ваши доменные объекты по сути точные копии ваших доменных объектов? Зачем делать различие?
qui 14.12.2008 17:03:51
«Не компилируется» означает, что вы получаете сообщение. Что за сообщение?
Amy B 14.12.2008 18:58:00
2 ОТВЕТА

Почему вы делаете объединение и дополнительный выбор? Вы можете просто использовать результаты вашего объединения в создании нового объекта. Имейте в виду, что если между концертами и площадками нет отношений один на один, у вас могут возникнуть проблемы.

Попробуй это:

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 }
1
14.12.2008 17:04:48

Ваш внутренний запрос 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» возвращают нуль, если в запросе нет данных; другие выбрасывают.)

Я также согласен с Майком, что объединение может более соответствовать тому, что вы хотели, если речь идет об особых отношениях.

2
14.12.2008 19:00:45