Formułowanie połączeń i zapytań między produktami
W poniższych przykładach pokazano, jak połączyć wyniki z wielu tabel.
Przykład 1
W poniższym przykładzie użyto nawigacji klucza obcego From
w klauzuli w języku Visual Basic (from
klauzula w języku C#), aby wybrać wszystkie zamówienia dla klientów w Londynie.
var infoQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select ord;
Dim infoQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select ord
Przykład 2
W poniższym przykładzie użyto nawigacji klucza obcego Where
w klauzuli w języku Visual Basic (where
klauzula w języku C#), aby odfiltrować wartość out-of-stockProducts
, której Supplier
element znajduje się w Stany Zjednoczone.
var infoQuery =
from prod in db.Products
where prod.Supplier.Country == "USA" && prod.UnitsInStock == 0
select prod;
Dim infoQuery = _
From prod In db.Products _
Where prod.Supplier.Country = "USA" AndAlso _
CShort(prod.UnitsInStock) = 0 _
Select prod
Przykład 3
W poniższym przykładzie użyto nawigacji klucza obcego From
w klauzuli w języku Visual Basic (from
klauzula w języku C#), aby filtrować pracowników w Seattle i wyświetlać listę ich terytoriów.
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
};
Przykład 4
W poniższym przykładzie użyto nawigacji klucza obcego Select
w klauzuli w języku Visual Basic (select
klauzula w języku C#) do filtrowania par pracowników, w których jeden pracownik zgłasza się do drugiego i gdzie obaj pracownicy pochodzą z tego samego City
elementu .
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
};
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
Przykład 5
Poniższy przykład języka Visual Basic szuka wszystkich klientów i zamówień, upewnia się, że zamówienia są dopasowane do klientów i gwarantuje, że dla każdego klienta na tej liście podano nazwę kontaktu.
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
Przykład 6
Poniższy przykład jawnie łączy dwie tabele i wyniki projektów z obu tabel.
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() };
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()
Przykład 7
Poniższy przykład jawnie łączy trzy tabele i wyniki projektów z każdego z nich.
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()
};
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()
Przykład 8
W poniższym przykładzie pokazano, jak osiągnąć LEFT OUTER JOIN
wartość przy użyciu polecenia DefaultIfEmpty()
. Metoda DefaultIfEmpty()
zwraca wartość null, jeśli nie Order
ma wartości dla elementu Employee
.
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 };
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
Przykład 9
Poniższy przykład projektuje let
wyrażenie wynikające z sprzężenia.
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 };
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
Przykład 10
W poniższym przykładzie pokazano join
element z kluczem złożonym.
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 };
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
Przykład 11
W poniższym przykładzie pokazano, jak skonstruować lokalizację, w join
której jedna strona jest dopuszczana do wartości null, a druga nie.
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 };
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