¿Cómo realizar la unión externa izquierda en C # LINQ a objetos sin usar join-on-equals-into
cláusulas? ¿Hay alguna manera de hacer eso con where
cláusula? Problema correcto: la unión interna es fácil y tengo una solución como esta
List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
select new JoinPair { LeftId = l.Id, RightId = r.Id})
pero para la unión externa izquierda necesito una solución. El mío es algo como esto pero no funciona
List< JoinPair> leftFinal = (from l in lefts from r in rights
select new JoinPair {
LeftId = l.Id,
RightId = ((l.Key==r.Key) ? r.Id : 0
})
donde JoinPair es una clase:
public class JoinPair { long leftId; long rightId; }
Respuestas:
Como se indica en:
101 muestras LINQ - Unión externa izquierda
fuente
Si se utiliza un proveedor LINQ basado en una base de datos, se puede escribir una combinación externa izquierda significativamente más legible como tal:
Si omites el
DefaultIfEmpty()
, tendrá una unión interna.Tome la respuesta aceptada:
Esta sintaxis es muy confusa, y no está claro cómo funciona cuando quieres unir tablas MÚLTIPLES.
Nota:
Debe tenerse en cuenta que
from alias in Repo.whatever.Where(condition).DefaultIfEmpty()
es lo mismo que una aplicación externa / combinación izquierda-lateral, que cualquier optimizador de base de datos (decente) es perfectamente capaz de traducir en una combinación izquierda, siempre que no introduzca filas por fila. -valores (también conocido como una aplicación externa real). No haga esto en Linq-2-Objects (porque no hay un optimizador de DB cuando usa Linq-to-Objects).Ejemplo detallado
Cuando se usa con LINQ 2 SQL, se traducirá muy bien a la siguiente consulta SQL muy legible:
Editar:
Consulte también " Convertir consulta SQL Server a consulta Linq " para obtener un ejemplo más complejo.
Además, si lo está haciendo en Linq-2-Objects (en lugar de Linq-2-SQL), debe hacerlo a la antigua usanza (porque LINQ to SQL traduce esto correctamente para unir operaciones, pero sobre objetos este método fuerza un escaneo completo y no aprovecha las búsquedas de índice, por qué ...):
fuente
join
es mucho más legible y clara que lawhere
seguida porDefaultIfEmpty
Usando la expresión lambda
fuente
Enumerable.Empty<Product>.DefaultIfEmpty()
que significa que devolverá un IEnumerable con un solo valor dedefault(Product)
.Ahora como método de extensión:
Use como normalmente usaría join:
Espero que esto te ahorre algo de tiempo.
fuente
Echa un vistazo a este ejemplo . Esta consulta debería funcionar:
fuente
r
puede acceder en la cláusula select después de usar un join into?r
en la segundafrom
cláusula. es decir,from r in lrs.DefaultIfEmpty()
esta consulta no tiene mucho sentido y probablemente ni siquiera se compila debido a quer
está fuera de contexto para la selección.Clockwise
con John Cleese, jajaja.Una implementación de combinación externa izquierda por métodos de extensión podría verse como
El selector de resultados debe ocuparse de los elementos nulos. Fx.
fuente
mira este ejemplo
ahora puede
include elements from the left
incluso si ese elementohas no matches in the right
, en nuestro caso, recuperamosArlene
incluso él no tiene coincidencia en la derechaaqui esta la referencia
Cómo: Realizar uniones externas izquierdas (Guía de programación de C #)
fuente
Esta es la forma general (como ya se proporcionó en otras respuestas)
Sin embargo, aquí hay una explicación que espero aclare lo que esto realmente significa.
esencialmente crea un conjunto de resultados separado b_temp que efectivamente incluye 'filas' nulas para entradas en el lado derecho (entradas en 'b').
Luego la siguiente línea:
..itera sobre ese conjunto de resultados, configurando el valor nulo predeterminado para la 'fila' en el lado derecho, y configurando el resultado de la unión de la fila del lado derecho al valor de 'b_value' (es decir, el valor que está a la derecha lado de la mano, si hay un registro coincidente, o 'nulo' si no lo hay).
Ahora, si el lado derecho es el resultado de una consulta LINQ separada, consistirá en tipos anónimos, que solo pueden ser 'algo' o 'nulo'. Sin embargo, si es enumerable (por ejemplo, una Lista, donde MyObjectB es una clase con 2 campos), entonces es posible ser específico acerca de qué valores 'nulos' predeterminados se usan para sus propiedades:
Esto garantiza que 'b' en sí mismo no sea nulo (pero sus propiedades pueden ser nulas, utilizando los valores nulos predeterminados que ha especificado), y esto le permite verificar las propiedades de b_value sin obtener una excepción de referencia nula para b_value. Tenga en cuenta que para un DateTime anulable, un tipo de (DateTime?), Es decir, 'DateTime anulable' debe especificarse como el 'Tipo' del nulo en la especificación de 'DefaultIfEmpty' (esto también se aplicará a los tipos que no son 'nativos' 'nulables, por ejemplo, doble, flotante).
Puede realizar múltiples combinaciones externas izquierdas simplemente encadenando la sintaxis anterior.
fuente
Aquí hay un ejemplo si necesita unir más de 2 tablas:
Ref: https://stackoverflow.com/a/17142392/2343
fuente
Método de extensión que funciona como combinación izquierda con sintaxis Join
acaba de escribirlo en .NET core y parece estar funcionando como se esperaba.
Pequeña prueba:
fuente
Aquí hay una versión bastante fácil de entender usando la sintaxis del método:
fuente
Hay tres tablas: personas, escuelas y personas_escuelas, que conecta a las personas con las escuelas en las que estudian. Una referencia a la persona con id = 6 está ausente en la tabla personas_escuelas. Sin embargo, la persona con id = 6 se presenta en la cuadrícula de resultados unidos a la izquierda.
fuente
Esta es una sintaxis SQL en comparación con la sintaxis LINQ para uniones internas y externas externas. Izquierda combinación externa:
http://www.ozkary.com/2011/07/linq-to-entity-inner-and-left-joins.html
"El siguiente ejemplo hace una unión grupal entre producto y categoría. Esta es esencialmente la unión izquierda. La expresión into devuelve datos incluso si la tabla de categorías está vacía. Para acceder a las propiedades de la tabla de categorías, ahora debemos seleccionar del resultado enumerable agregando el desde cl en la declaración catList.DefaultIfEmpty ().
fuente
Realizar uniones externas izquierdas en linq C # // Realizar uniones externas izquierdas
https://dotnetwithhamid.blogspot.in/
fuente
Me gustaría agregar que si obtiene la extensión MoreLinq ahora hay soporte para uniones izquierdas homogéneas y heterogéneas ahora
http://morelinq.github.io/2.8/ref/api/html/Overload_MoreLinq_MoreEnumerable_LeftJoin.htm
ejemplo:
EDITAR:
En retrospectiva, esto puede funcionar, pero convierte el IQueryable en un IEnumerable ya que morelinq no convierte la consulta a SQL.
En su lugar, puede usar un GroupJoin como se describe aquí: https://stackoverflow.com/a/24273804/4251433
Esto asegurará que permanezca como IQueryable en caso de que necesite realizar más operaciones lógicas en él más adelante.
fuente
La manera fácil es usar la palabra clave Let. Esto funciona para mi.
Esta es una simulación de Left Join. Si cada elemento de la tabla B no coincide con el elemento A, BItem devuelve nulo
fuente
Si necesita unirse y filtrar algo, puede hacerlo fuera de la unión. El filtro se puede hacer después de crear la colección.
En este caso, si hago esto en la condición de unión, reduzco las filas que se devuelven.
Se usa condición ternaria
(= n == null ? "__" : n.MonDayNote,)
Si el objeto es
null
(entonces no coincide), entonces devuelve lo que está después de?
.__
, en este caso.Si no, regrese lo que es después de la
:
,n.MonDayNote
.Gracias a los otros colaboradores que es donde comencé con mi propio problema.
fuente
SALIDA
fuente
Según mi respuesta a una pregunta similar, aquí:
Unión externa izquierda de Linq a SQL utilizando la sintaxis de Lambda y la unión en 2 columnas (clave de combinación compuesta)
Obtén el código aquí , o clona mi repositorio de github , ¡y juega!
Consulta:
Lambda
fuente
Descripción general: en este fragmento de código, demuestro cómo agrupar por ID donde Table1 y Table2 tienen una relación de uno a muchos. Agrupo en Id, Field1 y Field2. La subconsulta es útil, si se requiere una tercera búsqueda de tabla y se hubiera requerido una relación de unión izquierda. Muestro una agrupación de unión izquierda y una subconsulta linq. Los resultados son equivalentes.
fuente
fuente
Solución simple para la IZQUIERDA EXTERIOR IZQUIERDA :
notas :
fuente
setA
ysetB
la respuesta.