Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将此具有左连接的SQL转换为LINQ_Sql_Linq_Sql To Linq Conversion - Fatal编程技术网

将此具有左连接的SQL转换为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'

有两张桌子,学校和学期。必须显示学校记录,但学期记录可能不存在,因此,学期可能为空,因此左键连接。如果存在左联接表,则必须按当前术语的日期对其进行筛选。这可以在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中实现同样的效果:


我终于明白了。如果将.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();