首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SQL语句转换为Linq语句(3个表左转联接+其中)

将SQL语句转换为Linq语句(3个表左转联接+其中)
EN

Stack Overflow用户
提问于 2014-12-17 05:47:56
回答 1查看 84关注 0票数 2

这是我需要转换为Linq的工作sql:

代码语言:javascript
运行
复制
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'

我一整天都在尝试来自不同帖子的建议,这是我所能做的最好的,问题是它是一个内部连接,我需要它是一个左连接,这样我就可以在给定的时间间隔内得到所有的吊舱:

代码语言:javascript
运行
复制
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();

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-17 06:06:41

考虑到您的SQL中的WHERE筛选器将有效地使左边的外部联接变得多余,因为任何失败的联接都将是filtered out by the WHERE clause,您可以利用这个事实通过没有导航的连接表手动投影内部联接(而且性能可能很糟糕):

代码语言:javascript
运行
复制
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进行导航,那么为什么不修复所有三个表上的导航,这将允许更简单的导航:

代码语言:javascript
运行
复制
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连接实体,而EventPod将成为直接导航的对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27519096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档