这是我需要转换为Linq的工作sql:
select * from dbo.Pod p
left join dbo.PodEvent pe on p.PodId = pe.Pod_PodId
left join dbo.Event e on pe.Event_EventId = e.EventId
where e.StartDateTime >= '2014-12-24 09:00:00.000'
and e.EndDateTime <= '2014-12-24 14:30:00.000'我一整天都在尝试来自不同帖子的建议,这是我所能做的最好的,问题是它是一个内部连接,我需要它是一个左连接,这样我就可以在给定的时间间隔内得到所有的吊舱:
List<Pod> pods =
(from p in db.Pods
join pe in db.PodEvents on p.PodId equals pe.Pod.PodId
join e in db.Events on pe.Event.EventId equals e.EventId
where
e.StartDateTime == userInfo.StartDateTime
&&
e.EndDateTime <= userInfo.EndDateTime
select p).ToList();谢谢
发布于 2014-12-17 06:06:41
考虑到您的SQL中的WHERE筛选器将有效地使左边的外部联接变得多余,因为任何失败的联接都将是filtered out by the WHERE clause,您可以利用这个事实通过没有导航的连接表手动投影内部联接(而且性能可能很糟糕):
var pods = db.Events.Where(e => e.StartDateTime >= userInfo.StartDateTime
&& e.EndDateTime < userInfo.EndDateTime)
.Join(db.PodEvents,
e => e.EventID,
pe => pe.EventId,
new (e, pe) => {
Event = e,
PodEvent = pe,
Pod = db.Pods.Single(p => p.PodId == pe.PodID)
})
.SelectMany(x => x.Pod);但是,既然您已经通过pe.Event.EventId进行导航,那么为什么不修复所有三个表上的导航,这将允许更简单的导航:
var pods = db.Events.Where(e => e.StartDateTime >= userInfo.StartDateTime
&& e.EndDateTime < userInfo.EndDateTime)
.SelectMany(e => e.PodEvents.Select(pe => pe.Pod));另外,如果PodEvent只是一个连接表(EventId, PodId) --通过将其建模为多个: EF中的很多都可以完全避免PodEvent连接实体,而Event和Pod将成为直接导航的对象。
https://stackoverflow.com/questions/27519096
复制相似问题