Адаптация объектов 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
}
};
Однако это не компилируется!!!
Можно ли адаптировать дочерние объекты, используя подход "выбрать новый"?
Что я так делаю очень-очень неправильно?
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" возвращают ноль, если в запросе нет данных; другие выдают.)
Я также согласен с Майком, что объединение может более соответствовать тому, что вы хотели, если речь идет об особых отношениях.
Почему вы делаете объединение и дополнительный выбор? Вы можете просто использовать результаты вашего объединения в создании нового объекта. Имейте в виду, что если между концертами и площадками нет отношений один на один, у вас могут возникнуть проблемы.
Попробуй это:
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 }