Gewusst wie: Formulieren von Joins und produktübergreifenden Abfragen
In den folgenden Beispielen wird gezeigt, wie Ergebnisse aus mehreren Tabellen kombiniert werden.
Beispiel 1
Das folgende Beispiel verwendet Fremdschlüsselnavigation in der From
-Klausel in Visual Basic (from
-Klausel in C#), um alle Bestellungen für Kunden aus London auszuwählen.
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
Beispiel 2
Das folgende Beispiel verwendet Fremdschlüsselnavigation in der Where
-Klausel in Visual Basic (where
-Klausel in C#), um nicht mehr lieferbare Products
herauszufiltern, deren Supplier
sich in den Vereinigten Staaten befindet.
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
Beispiel 3
Das folgende Beispiel verwendet Fremdschlüsselnavigation in der From
-Klausel in Visual Basic (from
-Klausel in C#), um Mitarbeiter in Seattle herauszufiltern und deren Gebiete anzuzeigen.
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
};
Beispiel 4
Das folgende Beispiel verwendet Fremdschlüsselnavigation in der Select
-Klausel in Visual Basic (select
-Klausel in C#), um Mitarbeiterpaare herauszufiltern, bei denen ein Mitarbeiter dem anderen untersteht und bei denen beide Mitarbeiter aus der gleichen City
stammen.
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
Beispiel 5
Im folgenden Visual Basic-Beispiel wird nach allen Kunden und Bestellungen gesucht und es wird sichergestellt, dass die Bestellungen den Kunden zugeordnet werden und dass für jeden Kunden in der Liste ein Kontaktname angegeben wird.
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
Beispiel 6
Im folgenden Beispiel werden zwei Tabellen explizit verknüpft, und die Ergebnisse aus beiden Tabellen werden projiziert.
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()
Beispiel 7
Im folgenden Beispiel werden explizit drei Tabellen verknüpft, und Ergebnisse aus diesen werden projiziert.
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()
Beispiel 8
Im folgenden Beispiel wird das Erreichen einer LEFT OUTER JOIN
mithilfe von DefaultIfEmpty()
veranschaulicht. Die DefaultIfEmpty()
-Methode gibt NULL zurück, wenn es keine Order
für den Employee
gibt.
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
Beispiel 9
Das folgende Beispiel projiziert einen let
-Ausdruck, der sich aus einem Join ergibt.
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
Beispiel 10
Im folgenden Beispiel wird ein join
mit einem zusammengesetzten Schlüssel gezeigt.
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
Beispiel 11
Das folgende Beispiel zeigt die Konstruktion eines join
, bei dem eine Seite auf NULL festgelegt werden kann und die andere nicht.
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