将此SQL与左连接转换为LINQ
有两个表格,学校和学期。学校记录必须显示,但记录的词语可能尚不存在,因此,该词可能为空(即左连接)。如果存在,则必须按照当前术语的日期过滤左连接表。这可以在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同样的事情:
我终于弄清楚了。如果将.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();
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)
barakcaf,我认为这是一个正确的答案,但研究它过去一小时后,我意识到,如果一个学校没有学期,“开始”和“结束”的空值没有出现在这些栏中。我将发布显示左连接的LinqPad代码,但它仍不起作用。欣赏输入但尚未完成。 –
这是对您的原始问题的回答(您的linqPad代码几乎与此相同),如果您有其他要求,您应该打开一个新问题或更详细地解释您需要执行的操作 – barakcaf
barakcaf,我添加了屏幕快照我试图在更新#2中实现的结果。我需要能够做一个左连接并检索所有的学校名称,如果学校没有学期,那么它会返回一个null,它在SQL中很好地执行。我一直无法在LINQ中复制这个结果。感谢您的帮助。 –
https://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9#leftouterjoin –