Конвертировать этот 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)