使用左连接将此 SQL 转换为 LINQ

Convert this SQL with left join to LINQ

有两个table,学校和学期。必须显示学校记录,但学期记录可能尚不存在,因此学期可能为空(因此左连接)。左联接 table 必须按当前术语的日期过滤(如果存在)。这可以在 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

更新:

输入一些内容后,我进行了左连接,但如果学校缺少一个学期,我仍然无法将开始日期和结束日期显示为空 - 如果我缺少一个学期,学校根本不会显示,并且我希望学校显示在第一列中。我错过了什么??这是最新的 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 中实现同样的事情:

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) 

我终于明白了。如果将 .Where() 子句放在联接的 table 上,如果没有匹配的记录,您将获得空值。这是有效的 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();