我有以下代码使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
}
};
然而这并没有编译!!!
是否可以使用“选择新”方法调整儿童对象?
我在做什么这么非常错?
答案 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 }