使用左连接将此 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();
有两个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();