Конвертировать этот SQL с левым соединением в LINQ

Есть две таблицы, школа и семестр. Школьная запись должна быть показана, но термин "запись" может еще не существовать, поэтому термин может быть нулевым (таким образом, левое соединение). Левая объединенная таблица должна быть отфильтрована по дате для текущего термина, если он существует. Можно ли это сделать в 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:

2 ответа

Решение

Я наконец-то понял. Если вы поместите предложение.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) 
Другие вопросы по тегам