Compartir a través de


Cómo: Formular uniones y consultas de varios productos (LINQ to SQL)

En los ejemplos siguientes se muestra cómo combinar los resultados procedentes de varias tablas.

Ejemplo

En el ejemplo siguiente se utiliza la navegación de clave externa en la cláusula From de Visual Basic (cláusula from en C#) para seleccionar todos los pedidos de los clientes de Londres.

Dim infoQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select ord
var infoQuery =
    from cust in db.Customers
    from ord in cust.Orders
    where cust.City == "London"
    select ord;

En el ejemplo siguiente se utiliza la navegación de clave externa en la cláusula Where de Visual Basic (cláusula where en C#) para aplicar un filtro y obtener los Products agotados cuyo Supplier se encuentra en Estados Unidos.

Dim infoQuery = _
    From prod In db.Products _
    Where prod.Supplier.Country = "USA" AndAlso _
        CShort(prod.UnitsInStock) = 0 _
    Select prod
var infoQuery =
    from prod in db.Products
    where prod.Supplier.Country == "USA" && prod.UnitsInStock == 0
    select prod;

En el ejemplo siguiente se utiliza la navegación de clave externa en la cláusula From de Visual Basic (cláusula from en C#) para aplicar un filtro y obtener los empleados de Seattle y una lista de sus áreas.

var infoQuery =
    from emp in db.Employees
    from empterr in emp.EmployeeTerritories
    where emp.City == "Seattle"
    select new
    {
        emp.FirstName,
        emp.LastName,
        empterr.Territory.TerritoryDescription
    };

En el ejemplo siguiente se utiliza la navegación de clave externa en la cláusula Select de Visual Basic (cláusula select en C#) para aplicar un filtro y obtener pares de empleados de tal forma que uno de ellos esté subordinado al otro, siendo ambos de la misma City.

Dim infoQuery = _
    From e1 In db.Employees, e2 In e1.Employees _
    Where e1.City = e2.City _
    Select FirstName1 = e1.FirstName, _
        LastName1 = e1.LastName, FirstName2 = e2.FirstName, _
        LastName2 = e2.LastName, e1.City
            var infoQuery =
                from emp1 in db.Employees
                from emp2 in emp1.Employees
                where emp1.City == emp2.City
                select new
                {
                    FirstName1 = emp1.FirstName,
                    LastName1 = emp1.LastName,
                    FirstName2 = emp2.FirstName,
                    LastName2 = emp2.LastName,
                    emp1.City
                };

En el ejemplo siguiente de Visual Basic se buscan todos los clientes y pedidos, se comprueba que los pedidos estén asociados a clientes y se garantiza que para cada cliente de la lista se proporciona un nombre de contacto.

Dim q1 = From c In db.Customers, o In db.Orders _
    Where c.CustomerID = o.CustomerID _
    Select c.CompanyName, o.ShipRegion

' Note that because the O/R designer generates class
' hierarchies for database relationships for you,
' the following code has the same effect as the above
' and is shorter:

Dim q2 = From c In db.Customers, o In c.Orders _
    Select c.CompanyName, o.ShipRegion

For Each nextItem In q2
    Console.WriteLine("{0}   {1}", nextItem.CompanyName, _
        nextItem.ShipRegion)
Next

En el ejemplo siguiente se combinan explícitamente dos tablas y se proyectan los resultados de ambas.

Dim q = From c In db.Customers _
    Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
        Into orders = Group _
    Select c.ContactName, OrderCount = orders.Count()
var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into orders
    select new { c.ContactName, OrderCount = orders.Count() };

En el ejemplo siguiente se combinan explícitamente tres tablas y se proyectan los resultados de cada una de ellas.

Dim q = From c In db.Customers _
    Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
        Into ords = Group _
        Group Join e In db.Employees On c.City Equals e.City _
            Into emps = Group _
    Select c.ContactName, ords = ords.Count(), emps = emps.Count()
var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into ords
    join e in db.Employees on c.City equals e.City into emps
    select new
    {
        c.ContactName,
        ords = ords.Count(),
        emps = emps.Count()
    };

En el ejemplo siguiente se muestra cómo lograr una LEFT OUTER JOIN mediante DefaultIfEmpty(). El método DefaultIfEmpty() devuelve null cuando no hay ningún Order para Employee.

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 e.FirstName, e.LastName, Order = o
var q =
    from e in db.Employees
    join o in db.Orders on e equals o.Employee into ords
        from o in ords.DefaultIfEmpty()
        select new { e.FirstName, e.LastName, Order = o };

En el ejemplo siguiente se proyecta una expresión let que es el resultado de una combinación.

Dim q = From c In db.Customers _
    Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
        Into ords = Group _
    Let z = c.City + c.Country _
        From o In ords _
        Select c.ContactName, o.OrderID, z
var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into ords
    let z = c.City + c.Country
        from o in ords
        select new { c.ContactName, o.OrderID, z };

En el ejemplo siguiente se muestra una join con una clave compuesta.

Dim q = From o In db.Orders _
    From p In db.Products _
    Group Join d In db.OrderDetails On New With {o.OrderID, _
        p.ProductID} _
        Equals New With {d.OrderID, d.ProductID} Into details _
            = Group _
        From d In details _
    Select o.OrderID, p.ProductID, d.UnitPrice
var q =
    from o in db.Orders
    from p in db.Products
    join d in db.OrderDetails
        on new { o.OrderID, p.ProductID } equals new
    {
        d.OrderID,
        d.ProductID
    } into details
        from d in details
        select new { o.OrderID, p.ProductID, d.UnitPrice };

En el ejemplo siguiente se muestra cómo construir una join de tal forma que una parte acepte valores NULL y la otra no.

Dim q = From o In db.Orders _
    Group Join e In db.Employees On o.EmployeeID _
        Equals e.EmployeeID Into emps = Group _
        From e In emps _
    Select o.OrderID, e.FirstName
var q =
    from o in db.Orders
    join e in db.Employees
        on o.EmployeeID equals (int?)e.EmployeeID into emps
        from e in emps
        select new { o.OrderID, e.FirstName };

Vea también

Otros recursos

Ejemplos de consultas (LINQ to SQL)