¿Podría alguien darme un ejemplo de cómo realizar una operación de unión a la izquierda utilizando expresiones LINQ/lambda?Unir a la izquierda con LINQ
Respuesta
El LINQ to SQL samples page en MSDN proporciona un ejemplo de cómo lograr esto. El código debería ser bastante idéntico para LINQ to Objects.
La clave aquí es la llamada al DefaultIfEmpty
.
Dim q = From e In db.Employees _
Group Join o In db.Orders On e Equals o.Employee Into ords = Group _
From o In ords.DefaultIfEmpty _
Select New With {e.FirstName, e.LastName, .Order = o}
Si necesita ayuda para convertir que a C#, solo pregunte.
Aquí hay un example of a left join en LINQ.
Por ejemplo:
IQueryable<aspnet_UsersInRole> q = db.aspnet_Roles
.Select(p => p.aspnet_UsersInRoles
.SingleOrDefault(x => x.UserId == iduser));
le dará una lista de los roles de los miembros asp.net, con nulos en los que no se corresponde con la tecla (idUser) de usuario especificado
La forma en que he encontrado que me gusta es combinar OuterCollection.SelectMany()
con InnerCollection.DefaultIfEmpty()
. Puede ejecutar lo siguiente en LINQPad usando el modo "Sentencias C#".
var teams = new[]
{
new { Id = 1, Name = "Tigers" },
new { Id = 2, Name = "Sharks" },
new { Id = 3, Name = "Rangers" },
};
var players = new[]
{
new { Name = "Abe", TeamId = 2},
new { Name = "Beth", TeamId = 4},
new { Name = "Chaz", TeamId = 1},
new { Name = "Dee", TeamId = 2},
};
// SelectMany generally aggregates a collection based upon a selector: from the outer item to
// a collection of the inner item. Adding .DefaultIfEmpty ensures that every outer item
// will map to something, even null. This circumstance makes the query a left outer join.
// Here we use a form of SelectMany with a second selector parameter that performs an
// an additional transformation from the (outer,inner) pair to an arbitrary value (an
// an anonymous type in this case.)
var teamAndPlayer = teams.SelectMany(
team =>
players
.Where(player => player.TeamId == team.Id)
.DefaultIfEmpty(),
(team, player) => new
{
Team = team.Name,
Player = player != null ? player.Name : null
});
teamAndPlayer.Dump();
// teamAndPlayer is:
// {
// {"Tigers", "Chaz"},
// {"Sharks", "Abe"},
// {"Sharks", "Dee"},
// {"Rangers", null}
// }
Mientras se experimenta con esto, me encontré con que a veces se puede omitir la comprobación de nulo player
en la creación de instancias del tipo anónimo. Creo que este es el caso cuando uso LINQ-to-SQL en una base de datos (en lugar de estas matrices aquí, lo cual creo que lo convierte en LINQ-to-objects o algo así). Creo que la omisión del cheque nulo funciona en LINQ -to-SQL porque la consulta se traduce en un SQL LEFT OUTER JOIN
, que se salta directamente para unir nulo con el elemento externo. (Tenga en cuenta que el valor de la propiedad del objeto anónimo debe ser anulable, por lo que si desea incluir de manera segura un int
, necesitará algo como: new { TeamId = (int?)player.TeamId }
.
intenté reproducir el famoso left join donde b key es nula y el resultado lo que tengo es este método de extensión (con un poco de imaginación se puede modificarlo para simplemente hacer una izquierda unirse a):
public static class extends
{
public static IEnumerable<T> LefJoinBNull<T, TKey>(this IEnumerable<T> source, IEnumerable<T> Target, Func<T, TKey> key)
{
if (source == null)
throw new ArgumentException("source is null");
return from s in source
join j in Target on key.Invoke(s) equals key.Invoke(j) into gg
from i in gg.DefaultIfEmpty()
where i == null
select s;
}
}
- 1. Unir a la izquierda con la cláusula Where
- 2. HQL, unir a la izquierda en la misma tabla
- 3. Linq a Entidad con múltiples combinaciones externas a la izquierda
- 4. Unir a la izquierda la misma mesa varias veces
- 5. IZQUIERDA UNIR COMO NUEVA columna?
- 6. ¿Cómo hacer IZQUIERDA unir con más de 2 tablas?
- 7. Linq a Sql: varias combinaciones externas a la izquierda
- 8. LINQ, no se puede unir a la cadena
- 9. linq a sql: unir varias columnas de la misma tabla
- 10. error en LINQ combinación izquierda
- 11. LINQ a SQL y unir dos tablas con la cláusula OR
- 12. Obtener datos de dos tablas (unir) con linq y devolver el resultado a la vista
- 13. número Display con ceros a la izquierda
- 14. Entero con ceros a la izquierda
- 15. int.Parse() con ceros a la izquierda
- 16. Unir a la izquierda en Postgres Valores no devueltos para nulo
- 17. Optimizar IZQUIERDA unir en la tabla con más de 30 000 filas
- 18. ¿Cómo hacer IZQUIERDA UNIÓN en LINQ a Entidades?
- 19. Unión con LINQ a XML
- 20. LINQ to SQL Left External Unir
- 21. Linq con combinación izquierda en SubQuery que contiene el recuento
- 22. Unir a la izquierda o seleccionar de varias tablas usando coma (,)
- 23. ¿Cómo hago una combinación externa izquierda con Dynamic Linq?
- 24. Cómo limitar una combinación externa izquierda LINQ a una fila
- 25. SQL unir tres tablas, unir a la precedencia
- 26. NHibernate 3 - combinación izquierda re-solución LINQ
- 27. LINQ - combinación izquierda, Grupo A, y el conde
- 28. externa izquierda en la sintaxis/método lambda en LINQ
- 29. Seleccione todas las columnas después de UNIR en LINQ
- 30. ¿Cómo lograr Izquierda Excluir JOIN usando LINQ?
Todos a bordo del LINQ Lambda expreso – mquander
Jaja Sin embargo, en lugar de ver esto. Después de recibir un castigo por los votos a favor, pensé que volvería a escribir la pregunta en un inglés decente, ya que de hecho parece ser válida. – Noldorin
@mquander: ::: Lee el original Pregunta de respuesta: Eso y tu comentario provocaron una sonrisa. – Brian