Адаптация объектов Linq Entity к объектам домена - PullRequest
1 голос
/ 14 декабря 2008

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

               };

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 декабря 2008

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

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

1 голос
/ 14 декабря 2008

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

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

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 }
...