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.

Consultar Tablas Relacionadas(Inner Join) Sql Server

sábado, 8 de septiembre de 2012

Cuando se trabaja con base de datos en mas de una ocasión tocara hacer consultas a tablas que se encuentran relacionadas ahora veremos como hacerlo usando inner join.

Para este ejemplo he creado una base de datos llamada Productos que cuenta con 2 tablas que están relacionadas Categoría y Articulo.

Tablas


Como pueden notar son 2 tablas Categoría y Articulo que tienen un campo en común por el cual están relacionadas CatId.

También e agregado algunos registros a cada tabla.

Categoria


Articulo


Como pueden notar he agregado 3 categorías y algunos artículos en donde cada articulo pertenece a un código de categoría.

Ahora veamos como hacer una consulta para obtener el nombre y el precio de los artículos que pertenezcan a una categoría.
select ArtNombre, ArtPrecio
From Articulo art Inner Join Categoria cat
on art.CatId = cat.CatId
Where CatNombre = 'Bebidas'

Lo primero que hacemos es un select a los campos que necesitamos en este caso nombre y precio luego hacemos la relación a las 2 tablas usando inner join por medio del campo que tienen en común CatId y por ultimo especificamos que nos muestre los artículos que pertenezcan a la categoría Bebidas.

Con esta consulta obtendríamos el nombre y precio de los artículos que son de la categoría bebidas.

Consulta


Bueno eso seria todos espero les sirva de algo.

Les dejo la base de datos por si quieren hacer pruebas.

Descargar Base de Datos


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