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