Мне нужно сделать левое соединение на нескольких условиях, где условия OR
, а не AND
s. Я нашел множество образцов последнего, но изо всех сил стараюсь получить правильный ответ для моего сценария.
from a in tablea
join b in tableb on new { a.col1, a.col2 } equals new { b.col1, b.col2 }
group a by a into g
select new () { col1 = a.col1, col2 = a.col2, count = g.Count() }
отлично подходит для объединений, где должны соответствовать все условия. Мне нужно, чтобы соединение соответствовало on a.col1 = b.col1 OR a.col2 = b.col2
.
Я знаю, что это должно быть легко, но я не понимаю этого!
Edit:
Чтобы дать немного больше информации, цель запроса состоит в том, чтобы получить проекцию, содержащую все поля из "a", плюс количество совпадающих записей в "b". Я изменил пример выше, чтобы попытаться проиллюстрировать, что мне нужно. Когда я запускаю с помощью вышеописанного подхода, Джон Скит заметил, что я получаю подсчет всех записей от a, а не счет связанных записей в b.
Основное левое соединение отлично работает:
from a in tablea
from b in tableb
.Where( b => ( a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
select new { col1 = a.col1, col2 = a.col2 }
Если я пересмотрю его, чтобы добавить группировку, как показано ниже
from a in tablea
from b in tableb
.Where( b => ( a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
group a by a.col1 into g
select new { col1 = g.Key, count = g.Count() }
Я получаю количество записей, возвращаемых из a, а не количество записей в совпадении в b.
Edit:
Я дам ответ Джону - я решил проблему с подсчетом - я не понял, что могу использовать ламду для фильтрации счета (g.Count(x => x != null))
. Кроме того, мне нужно группировать букву "а", а не "а", как было выше. Это дает правильный результат, но SQL не так эффективен, как я бы написал его вручную, поскольку он добавляет коррелированный подзапрос - если кто-нибудь может посоветовать лучший способ написать его, чтобы имитировать следующий SQL, я был бы признателен!
select a.col1, count(b.col1)
from tablea a
left join tableb b
on a.col1 = b.col1
or a.col2 = b.col2
group by a.col1