【发布时间】:2020-09-26 23:22:40
【问题描述】:
我正在尝试使用 lambda 来加入 5 个表。我想知道的是我是否做得对,是否有更好的方法。任何建议都非常感谢。
var myList = _context.Event
.Join(_context.EventHost,
e => e.EventHostId,
eh => eh.Id,
(e, eh) => new { Event = e, EventHost = eh })
.Join(_context.EventAddress,
eh => eh.EventHost.EventAddressID,
ea => ea.ID,
(eh, ea) => new { EventAddress = ea, EventHost = eh })
.Join(_context.OrderHeaderGroup,
ea => ea.EventHost.Event.Id,
ohg => ohg.EventId,
(ea, ohg) => new { EventAddress = ea, OrderHeaderGroup = ohg })
.Join(_context.OrderHeader,
ohg => ohg.OrderHeaderGroup.OrderHeaderGroupID,
oh => oh.OrderHeaderGroupID,
(oh, ohg) => new { OrderHeader = oh, OrderHeaderGroup = ohg })
.Select(c => new {
c.OrderHeader.OrderHeaderGroup.EventId,
c.OrderHeader.EventAddress.EventAddress.Name,
c.OrderHeader.EventAddress.EventAddress.Phone,
c.OrderHeader.EventAddress.EventAddress.Address1,
c.OrderHeader.EventAddress.EventAddress.Address2,
c.OrderHeader.EventAddress.EventAddress.City,
c.OrderHeader.EventAddress.EventAddress.Country,
c.OrderHeader.EventAddress.EventAddress.PostalCode,
c.OrderHeader.EventAddress.EventAddress.Email,
c.OrderHeader.EventAddress.EventHost.Event.ConsultantId,
c.OrderHeader.EventAddress.EventHost.Event.StartDate,
c.OrderHeader.EventAddress.EventHost.Event.EndDate,
}).Where(x => x.ContactId == contactId && x.StartDate >= newStartDate && x.EndDate <= newEndDate).ToList();
【问题讨论】:
-
我只想指出,查询语法会使每个连接中的中间投影变平,您也可以这样做。例如,第二个连接可以投影
(xpi, ea) => new { EventAddress = ea, EventHost = xpi.EventHost, Event = xpi.Event })。这使得后续的连接和最终的投影更加清晰。 (xpi代表"transparent identifier")。 -
但是 Athanasios 是对的:使用查询语法。您在这里没有做任何需要您直接使用扩展方法的事情。
-
并且,使用查询语法,您可以将
where子句放在它自然所属的位置,而无需支付编写冗长的x => x.OrderHeader.EventAddress.EventHost.Event.StartDate >= newStartDate:where e.StartDate >= newStartDate select ...) 的代价。胜利的透明标识符。