Condividi tramite


Procedura: formulare join e query di prodotto incrociato (LINQ to SQL)

Negli esempi riportati di seguito viene illustrato come combinare risultati da più tabelle.

Esempio

Nell'esempio seguente viene utilizzata la navigazione con chiave esterna nella clausola From in Visual Basic (la clausola from in C#) per selezionare tutti gli ordini per i clienti nell'area londinese.

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;

Nell'esempio seguente viene utilizzata la navigazione con chiave esterna nella clausola Where in Visual Basic (la clausola where in C#) per filtrare Products senza scorta il cui Supplier risiede negli Stati Uniti.

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;

Nell'esempio seguente viene utilizzata la navigazione con chiave esterna nella clausola From in Visual Basic (la clausola from in C#) per filtrare i dipendenti di Seattle ed elencare i territori.

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
    };

Nell'esempio seguente viene utilizzata la navigazione con chiave esterna nella clausola Select in Visual Basic (la clausola select in C#) per filtrare le coppie di dipendenti in cui un dipendente riporta all'altro ed entrambi sono della stessa 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
                };

Nell'esempio di Visual Basic seguente vengono cercati tutti i clienti e gli ordini, viene controllato che gli ordini siano associati ai clienti e viene assicurato che per ogni cliente nell'elenco sia presente un nome del contatto.

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

Nell'esempio seguente vengono unite in join in modo esplicito due tabelle e vengono proiettati i risultati da entrambe le tabelle.

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() };

Nell'esempio seguente vengono unite in join in modo esplicito tre tabelle e vengono proiettati i risultati da ogni tabella.

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()
    };

Nell'esempio seguente viene illustrato come ottenere LEFT OUTER JOIN utilizzando DefaultIfEmpty(). Il metodo DefaultIfEmpty() restituisce null se non è presente alcun Order per 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 };

Nell'esempio seguente viene proiettata l'espressione let risultante da un join.

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 };

Nell'esempio seguente viene illustrato un join con una chiave composita.

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 };

Nell'esempio seguente viene descritto come costruire un join in cui un solo lato è nullable.

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 };

Vedere anche

Altre risorse

Eseguire una query sugli esempi (LINQ to SQL)