Gewusst wie: Formulieren von Verknüpfungen und produktübergreifenden Abfragen (LINQ to SQL)
Aktualisiert: November 2007
In den folgenden Beispielen wird gezeigt, wie Ergebnisse aus mehreren Tabellen kombiniert werden.
Beispiel
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.
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;
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.
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;
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
};
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.
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
};
Im folgenden Visual Basic-Beispiel wird nach allen Kunden und Bestellungen gesucht, 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
Im folgenden Beispiel werden zwei Tabellen explizit verknüpft, und die Ergebnisse aus beiden Tabellen werden projiziert.
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() };
Im folgenden Beispiel werden explizit drei Tabellen verknüpft, und Ergebnisse aus diesen werden projiziert.
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()
};
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.
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 };
Das folgende Beispiel projiziert einen let-Ausdruck, der sich aus einer Verknüpfung ergibt.
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 };
Im folgenden Beispiel wird ein join mit einem zusammengesetzten Schlüssel gezeigt.
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 };
Das folgende Beispiel zeigt die Konstruktion eines join, bei dem eine Seite auf NULL festgelegt werden kann und die andere nicht.
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 };