Necesito hacer una combinación izquierda en múltiples condiciones donde las condiciones son OR
s en lugar de AND
s. He encontrado muchas muestras de este último pero estoy luchando por obtener la respuesta correcta para mi situación.Linq - combinación izquierda en múltiples (O) condiciones
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() }
funciona muy bien para uniones donde todas las condiciones deben coincidir. Necesito obtener la unión para que coincida con on a.col1 = b.col1 OR a.col2 = b.col2
.
Sé que debe ser fácil, pero me he quedado en blanco en esto!
Editar:
para dar un poco más de información, con el propósito de la consulta es conseguir una proyección que contiene todos los campos de la 'a' más un recuento de los registros coincidentes en 'b'. Modifiqué el ejemplo anterior para intentar ilustrar lo que busco. Cuando corro con lo anterior usando el enfoque que Jon Skeet ha notado obtengo un recuento de todos los registros de a, no el conteo de los registros relacionados en b.
La izquierda se unen básica funciona bien:
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 }
Si revisarlo para agregar la agrupación de la siguiente manera
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() }
estoy recibiendo el conteo de los registros devueltos desde una - no es el recuento de registros en concordancia en b.
Editar:
voy a dar la respuesta a Jon - he resuelto mi problema recuento - que no se había dado cuenta que podría utilizar un lambda para filtrar el recuento (g.Count(x => x != null))
. Además, necesito agrupar b por a en lugar de por a como lo tenía anteriormente. Esto da el resultado correcto, pero el SQL no es tan eficiente como lo escribiría a mano, ya que agrega una sub consulta correlacionada. Si alguien puede aconsejar una mejor forma de escribirlo para simular el siguiente SQL, ¡lo agradecería!
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
Le sugiero que intente mi consulta * sin * la agrupación, y vea si eso está obteniendo los resultados que espera. Si lo hace, intente averiguar por qué la agrupación está fallando. ¿Tal vez agrupar por 'nuevo {a.col1, a.col2}'? –
Funciona bien como una selección básica de combinación a la izquierda: obtener el conteo fuera de la agrupación no se está comportando como esperaba si fuera una combinación equitativa básica. Tenga en cuenta la información adicional anterior. –