将此具有左连接的SQL转换为LINQ
有两张桌子,学校和学期。必须显示学校记录,但学期记录可能不存在,因此,学期可能为空,因此左键连接。如果存在左联接表,则必须按当前术语的日期对其进行筛选。这可以在LINQ中完成吗将此具有左连接的SQL转换为LINQ,sql,linq,sql-to-linq-conversion,Sql,Linq,Sql To Linq Conversion,有两张桌子,学校和学期。必须显示学校记录,但学期记录可能不存在,因此,学期可能为空,因此左键连接。如果存在左联接表,则必须按当前术语的日期对其进行筛选。这可以在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'
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中实现同样的效果:
我终于明白了。如果将.Where子句放在联接表上,如果没有匹配的记录,则将获得空值。以下是LinqPad LINQ语句,它在.NETMVC中运行良好
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();
barakcaf,我认为这是正确的答案,但在研究了过去一个小时后,我意识到如果学校没有学期,开始和结束的空值不会出现在这些列中。我将发布显示左连接的LinqPad代码,但它仍然不起作用。感谢您的输入,但现在还没有。这是对您原始问题的回答您的linqPad代码与此几乎相同,如果您有其他要求,您应该打开一个新问题或更准确地解释您需要dobarakcaf的内容,我添加了一个屏幕截图,显示我在更新2中尝试实现的结果。我需要能够进行左连接并检索所有学校名称,如果学校没有术语,则返回null,这在SQL中很好地实现了。我无法在LINQ中复制此结果。谢谢你的帮助。
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();