Cómo: Combinar datos con LINQ usando cláusulas Join (Visual Basic)
Visual Basic proporciona las Join
cláusulas de consulta y Group Join
para permitirle combinar el contenido de varias colecciones en función de los valores comunes entre las colecciones. Estos valores se conocen como valores de clave. Los desarrolladores familiarizados con los conceptos de base de datos relacionales reconocerán la Join
cláusula como INNER JOIN y la Group Join
cláusula como, de hecho, LEFT OUTER JOIN.
En los ejemplos de este tema se muestran algunas maneras de combinar datos mediante las cláusulas y Join
queryGroup Join
.
Crear un proyecto y agregar datos de ejemplo
Para crear un proyecto que contenga tipos y datos de ejemplo
Para ejecutar los ejemplos de este tema, abre Visual Studio y agrega un nuevo proyecto de aplicación de consola de Visual Basic. Haz doble clic en el archivo Module1.vb creado por Visual Basic.
En los ejemplos de este tema se usan los
Person
tipos yPet
los datos del ejemplo de código siguiente. Copia este código en el módulo predeterminadoModule1
creado por Visual Basic.Private _people As List(Of Person) Private _pets As List(Of Pet) Function GetPeople() As List(Of Person) If _people Is Nothing Then CreateLists() Return _people End Function Function GetPets(ByVal people As List(Of Person)) As List(Of Pet) If _pets Is Nothing Then CreateLists() Return _pets End Function Private Sub CreateLists() Dim pers As Person _people = New List(Of Person) _pets = New List(Of Pet) pers = New Person With {.FirstName = "Magnus", .LastName = "Hedlund"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Daisy", .Owner = pers}) pers = New Person With {.FirstName = "Terry", .LastName = "Adams"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Barley", .Owner = pers}) _pets.Add(New Pet With {.Name = "Boots", .Owner = pers}) _pets.Add(New Pet With {.Name = "Blue Moon", .Owner = pers}) pers = New Person With {.FirstName = "Charlotte", .LastName = "Weiss"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Whiskers", .Owner = pers}) ' Add a person with no pets for the sake of Join examples. _people.Add(New Person With {.FirstName = "Arlene", .LastName = "Huff"}) pers = New Person With {.FirstName = "Don", .LastName = "Hall"} ' Do not add person to people list for the sake of Join examples. _pets.Add(New Pet With {.Name = "Spot", .Owner = pers}) ' Add a pet with no owner for the sake of Join examples. _pets.Add(New Pet With {.Name = "Unknown", .Owner = New Person With {.FirstName = String.Empty, .LastName = String.Empty}}) End Sub
Class Person Public Property FirstName As String Public Property LastName As String End Class Class Pet Public Property Name As String Public Property Owner As Person End Class
Realizar una combinación interna mediante la cláusula Join
Inner JOIN combina datos de dos colecciones. Elementos para los que coinciden los valores de clave especificados. Se excluyen los elementos de cualquiera de las colecciones que no tienen un elemento coincidente en la otra colección.
En Visual Basic, LINQ proporciona dos opciones para realizar una combinación INNER JOIN: una combinación implícita y una combinación explícita.
Una combinación implícita especifica las colecciones que se van a combinar en una From
cláusula e identifica los campos clave coincidentes de una Where
cláusula . Visual Basic combina implícitamente las dos colecciones en función de los campos clave especificados.
Puedes especificar una combinación explícita mediante la Join
cláusula cuando desees ser específico sobre los campos clave que se van a usar en la combinación. En este caso, todavía se puede usar una Where
cláusula para filtrar los resultados de la consulta.
Realizar una combinación interna mediante la cláusula Join
Agrega el código siguiente al
Module1
módulo del proyecto para ver ejemplos de una combinación interna implícita y explícita.Sub InnerJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people, pet In pets Where pet.Owner Is pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Explicit Join. Dim petOwnersJoin = From pers In people Join pet In pets On pet.Owner Equals pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. output = New System.Text.StringBuilder() For Each pers In petOwnersJoin output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Both queries produce the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
Realizar una combinación externa izquierda mediante la cláusula de combinación de grupo
LEFT OUTER JOIN incluye todos los elementos de la colección izquierda de la combinación y solo los valores coincidentes de la colección del lado derecho de la combinación. Los elementos de la colección del lado derecho de la combinación que no tienen un elemento coincidente en la colección del lado izquierdo se excluyen del resultado de la consulta.
La Group Join
cláusula realiza, en efecto, una LEFT OUTER JOIN. La diferencia entre lo que se conoce normalmente como LEFT OUTER JOIN y lo que devuelve la Group Join
cláusula es que la cláusula agrupa los Group Join
resultados de la colección del lado derecho de la combinación para cada elemento de la colección del lado izquierdo. En una base de datos relacional, LEFT OUTER JOIN devuelve un resultado no agrupado en el que cada elemento del resultado de la consulta contiene elementos coincidentes de ambas colecciones de la combinación. En este caso, los elementos de la colección del lado izquierdo de la combinación se repiten para cada elemento coincidente de la colección del lado derecho. Verás el aspecto que tiene al completar el procedimiento siguiente.
Puedes recuperar los resultados de una Group Join
consulta como resultado no agrupado si amplías la consulta para devolver un elemento para cada resultado de consulta agrupado. Para ello, debes asegurarte de consultar en el DefaultIfEmpty
método de la colección agrupada. Esto garantiza que los elementos de la colección del lado izquierdo de la combinación se sigan incluyendo en el resultado de la consulta incluso si no tienen resultados coincidentes de la colección del lado derecho. Puedes agregar código a la consulta para proporcionar un valor de resultado predeterminado cuando no hay ningún valor coincidente de la colección del lado derecho de la combinación.
Realizar una combinación externa izquierda mediante la cláusula de combinación de grupo
Agrega el código siguiente al
Module1
módulo del proyecto para ver ejemplos de una combinación externa izquierda agrupada y una combinación externa izquierda desagrupada.Sub LeftOuterJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Grouped results. Dim petOwnersGrouped = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group Select pers.FirstName, pers.LastName, PetList ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwnersGrouped output.AppendFormat(pers.FirstName & ":" & vbCrLf) For Each pt In pers.PetList output.AppendFormat(vbTab & pt.Name & vbCrLf) Next Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: ' Daisy ' Terry: ' Barley ' Boots ' Blue Moon ' Charlotte: ' Whiskers ' Arlene: ' "Flat" results. Dim petOwners = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group From pet In PetList.DefaultIfEmpty() Select pers.FirstName, pers.LastName, PetName = If(pet Is Nothing, String.Empty, pet.Name) ' Display "flat" results. output = New System.Text.StringBuilder() For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output.ToString()) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers ' Arlene: End Sub
Realizar una combinación mediante una clave compuesta
Puedes usar la And
palabra clave en una Join
cláusula o Group Join
para identificar varios campos de clave que se van a usar al combinar valores de las colecciones. La And
palabra clave especifica que todos los campos de clave especificados deben coincidir para que los elementos se unan.
Para realizar una combinación mediante una clave compuesta
Agrega el código siguiente al
Module1
módulo del proyecto para ver ejemplos de una combinación que usa una clave compuesta.Sub CompositeKeyJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people Join pet In pets On pet.Owner.FirstName Equals pers.FirstName And pet.Owner.LastName Equals pers.LastName Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
ejecutar el código
Para agregar código para ejecutar los ejemplos
Reemplaza en
Sub Main
el módulo delModule1
proyecto por el código siguiente para ejecutar los ejemplos de este tema.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Presiona F5 para ejecutar el ejemplo.