2017-10-21 103 views
-1

有两个表格,学校和学期。学校记录必须显示,但记录的词语可能尚不存在,因此,该词可能为空(即左连接)。如果存在,则必须按照当前术语的日期过滤左连接表。这可以在LINQ中完成吗?将此SQL与左连接转换为LINQ

select school.school_name, term.term_start, term.term_end 
from school 
left join term on school.school_id = term.school_id and term.term_start <= '2017-10-21' and term.term_end >= '2017-10-21' 
where school.active = 1 
order by school.school_name 

UPDATE:

一些输入后,我有一个左连接,但如果一所学校缺少一个学期,我仍然不能使开始和结束日期显示为空 - 学校不显示在所有如果我错过了一个学期,我想让学校在第一栏中展示。我在想什么?这是最新的LinqPad代码。

var query = ((from sc in Schools.Where(s => s.Active == 1) 
      join t in Terms on sc.School_id equals t.School_id into ts 
      from tsub in ts.DefaultIfEmpty() 
      select new {name = sc.School_name, 
         start = tsub.Term_start, 
         end = tsub.Term_end}) 
      .Where (o => o.start <= DateTime.Now && o.end >= DateTime.Now)) 
      .OrderBy(o => o.name); 

query.Dump(); 

更新#2

下面是SQL结果的屏幕截图,我想实现在LINQ同样的事情:

enter image description here

+0

https://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9#leftouterjoin –

回答

-1

我终于弄清楚了。如果将.Where()子句放在连接的表上,如果没有匹配的记录,您将获得空值。这是LinqPad LINQ语句,它可以在.NET MVC中完美运行。

var query = ((from sc in Schools.Where(s => s.Active == 1) 
      join t in Terms.Where(x => x.Term_start <= DateTime.Now && x.Term_end >= DateTime.Now) on sc.School_id equals t.School_id into ts 
      from tsub in ts.DefaultIfEmpty() 
      select new {name = sc.School_name, 
         start = tsub.Term_start, 
         end = tsub.Term_end}) 
      .OrderBy(o => o.name)); 

query.Dump(); 
0
var query = from sc in school.Where(s = > s.active == 1) 
      join t in term on sc.school_id == t.school_id 
      select new {name = sc.school_name, 
         start = t.term_start, 
         end = term.term_end} 
      .Where (o => o.start <= '2017-10-21' && o.end >= '2017-10-21') 
      .OrderBy(o => o.school_name) 
+0

barakcaf,我认为这是一个正确的答案,但研究它过去一小时后,我意识到,如果一个学校没有学期,“开始”和“结束”的空值没有出现在这些栏中。我将发布显示左连接的LinqPad代码,但它仍不起作用。欣赏输入但尚未完成。 –

+0

这是对您的原始问题的回答(您的linqPad代码几乎与此相同),如果您有其他要求,您应该打开一个新问题或更详细地解释您需要执行的操作 – barakcaf

+0

barakcaf,我添加了屏幕快照我试图在更新#2中实现的结果。我需要能够做一个左连接并检索所有的学校名称,如果学校没有学期,那么它会返回一个null,它在SQL中很好地执行。我一直无法在LINQ中复制这个结果。感谢您的帮助。 –