Combinar Datos Linq(Cláusula Join) C# - VB.Net

sábado, 22 de septiembre de 2012

Siguiendo con ejemplos de linq ahora veremos como funciona la cláusula Join.

La cláusula Join sirve para establecer una relación entre 2 secuencias comparando sus claves.

 Los programadores familiarizados con conceptos de bases de datos relacionales reconocerán la cláusula Join como Inner Join.

 Mas información.
 join (Cláusula, Referencia de C#)

Veamos el diseño que tendrá nuestra aplicacion.

Diseño

 Ahora agregaremos 2 clases Categoría y Articulo.
public class Categoria
{
        public int CatId { get; set; }
        public string CatNombre { get; set; }

        public Categoria(int id, string nom)
        {
            CatId = id;
            CatNombre = nom;
        }
}
public class Articulo
{
        public int ArtId { get; set; }
        public string ArtNombre { get; set; }
        public double ArtPrecio { get; set; }
        public int CatId { get; set; }

        public Articulo(int id,string nom,double prec, int cat)
        {
            ArtId = id;
            ArtNombre = nom;
            ArtPrecio = prec;
            CatId = cat;
        }
}
Public Class Categoria
    Public Property CatId() As Integer
    Public Property CatNombre() As String
    Sub New(ByVal id As Integer, ByVal nom As String)
        CatId = id
        CatNombre = nom
    End Sub
End Class
Public Class Articulo
    Public Property ArtId() As Integer
    Public Property ArtNombre() As String
    Public Property ArtPrecio() As Double
    Public Property CatId() As Integer

    Sub New(ByVal id As Integer, ByVal nom As String, ByVal prec As Double, ByVal cat As Integer)
        ArtId = id
        ArtNombre = nom
        ArtPrecio = prec
        CatId = cat
    End Sub
End Class
Como podemos notar son 2 clases sencillas con algunas propiedades que usaremos para representar nuestros datos, importante notar que ambas clases tienen una propiedad en común CatId que es la que usaremos para establecer la relación entre ellas.

Ahora agreguemos algunos registros.

List<Categoria> categorialist = new List<Categoria>
{
     new Categoria(1, "Bebidas"),
     new Categoria(2, "Lacteos"),
     new Categoria(3, "Frutas")
};

List<Articulo> articulolist = new List<Articulo>
{
     new Articulo(1, "Cerveza negra Steeleye", 18.20, 1),
     new Articulo(2, "Queso Mozzarella", 34.50, 2),
     new Articulo(3, "Naranjas", 10.25, 3),
     new Articulo(4, "Cerveza Sasquatch", 15.00, 1),
     new Articulo(5, "Crema de Almejas", 9.75, 2),
     new Articulo(6, "Manzanas", 4.50, 3),
     new Articulo(7, "Vino Côte de Blaye", 250.25, 1),
     new Articulo(8, "Cerveza Heineken", 20.50, 1),
     new Articulo(9, "CocaCola", 5.75, 1)
};
    Dim categorialist As New List(Of Categoria)() From {
        New Categoria(1, "Bebidas"),
        New Categoria(2, "Lacteos"),
        New Categoria(3, "Frutas")
    }

    Dim articulolist As New List(Of Articulo)() From {
        New Articulo(1, "Cerveza negra Steeleye", 18.2, 1),
        New Articulo(2, "Queso Mozzarella", 34.5, 2),
        New Articulo(3, "Naranjas", 10.25, 3),
        New Articulo(4, "Cerveza Sasquatch", 15.0, 1),
        New Articulo(5, "Crema de Almejas", 9.75, 2),
        New Articulo(6, "Manzanas", 4.5, 3),
        New Articulo(7, "Vino Côte de Blaye", 250.25, 1),
        New Articulo(8, "Cerveza Heineken", 20.5, 1),
        New Articulo(9, "CocaCola", 5.75, 1)
    }
Hemos agregado 3 categorías y 9 artículos donde cada articulo tiene un código de categoría al que pertenece.

Carguemos los artículos en el datagrid sin aplicar join y veremos como se muestran.
private void Form1_Load(object sender, EventArgs e)
{
     var query = from art in articulolist select art;
     dataGridView1.DataSource = query.ToList();
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim query = From art In articulolist Select art
        DataGridView1.DataSource = query.ToList()
End Sub
Datos

Lo que hemos hecho es cargar los artículos en el datagrid normalmente.

Ahora veamos como utilizar el  Join  de linq para que no nos muestre el código de categoría(CatId) si no que nos muestre el nombre de la categoría la que el articulo pertenece.
var query = from cat in categorialist
            join art in articulolist
            on cat.CatId equals art.CatId
            orderby art.ArtId ascending
            select new { Id = art.ArtId, Nombre = art.ArtNombre, Precio = art.ArtPrecio, Categoria = cat.CatNombre };

dataGridView1.DataSource = query.ToList();
Dim query = From cat In categorialist
            Join art In articulolist
            On cat.CatId Equals art.CatId
            Order By art.ArtId Ascending
            Select New With {.Id = art.ArtId, .Nombre = art.ArtNombre, .Precio = art.ArtPrecio, .Categoria = cat.CatNombre}

DataGridView1.DataSource = query.ToList()
Como verán tiene un gran parecido al inner join de sql donde por medio de la propiedad que tienen en común CatId podemos establecer la relación entre ambas clases y así poder consultar los campos que necesitemos.

Join

Eso es todo espero les sirva mucho saludos desde El Salvador...

Descargar Proyecto C#

Descargar Proyecto VB.Net


No olvides suscribirte al blog para estar pendientes de mis últimos artículos.

0 comentarios:

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.