Beispiele für die Abfrageausdruckssyntax: Navigieren in Beziehungen (LINQ to Entities)
Die Navigationseigenschaften im Entitätsdatenmodell (EDM) sind Verknüpfungseigenschaften für die Suche nach Entitäten an den Enden einer Zuordnung. Navigationseigenschaften ermöglichen einem Benutzer mithilfe eines Zuordnungssatzes das Navigieren zwischen Entitäten bzw. zwischen einer Entität und verknüpften Entitäten. Dieses Thema enthält Beispiele für die Abfrageausdruckssyntax zum Navigieren von Beziehungen mithilfe von Navigationseigenschaften in LINQ-to-Entities-Abfragen.
Für das in den Beispielen verwendete "AdventureWorks Sales"-Modell wurde auf die Tabellen Contact, Address, Product, SalesOrderHeader und SalesOrderDetail der "AdventureWorks"-Beispieldatenbank zurückgegriffen.
Die Beispiele in diesem Thema verwenden die folgenden using/Imports-Anweisungen:
Option Explicit On
Option Strict On
Imports L2EExamplesVB.AdventureWorksModel
Imports System.Data.Objects
Imports System.Globalization
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using AdventureWorksModel;
using System.Globalization;
Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines LINQ to Entities-Projekts in Visual Studio.
Beispiel
Im folgenden Beispiel wird die Select-Methode verwendet, um sämtliche Kontakt-IDs abzurufen sowie die Summe des Gesamtbetrags für alle Kontakte mit dem Nachnamen "Zhou". Mit der Contact.SalesOrderHeader-Navigationseigenschaft wird eine Auflistung der SalesOrderHeader-Objekte für jeden Kontakt abgerufen. Die Sum-Methode verwendet die Contact.SalesOrderHeader-Navigationseigenschaft, um den Gesamtbetrag für alle Aufträge der einzelnen Kontakte zu summieren.
Using AWEntities As New AdventureWorksEntities
Dim contacts As ObjectQuery(Of Contact) = AWEntities.Contact
Dim ordersQuery = From contact In contacts _
Where contact.LastName = "Zhou" _
Select New With _
{.ContactID = contact.ContactID, _
.Total = contact.SalesOrderHeader.Sum(Function(o) o.TotalDue)}
For Each order In ordersQuery
Console.WriteLine("Contact ID: {0} Orders total: {1}", order.ContactID, order.Total)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Contact> contacts = AWEntities.Contact;
var ordersQuery = from contact in contacts
where contact.LastName == "Zhou"
select new
{
ContactID = contact.ContactID,
Total = contact.SalesOrderHeader.Sum(o => o.TotalDue)
};
foreach (var contact in ordersQuery)
{
Console.WriteLine("Contact ID: {0} Orders total: {1}", contact.ContactID, contact.Total);
}
}
Beispiel
Im folgenden Beispiel werden alle Aufträge der Kontakte mit dem Nachnamen "Zhou" abgerufen. Mit der Contact.SalesOrderHeader-Navigationseigenschaft wird eine Auflistung der SalesOrderHeader-Objekte für jeden Kontakt abgerufen. Der Name und die Aufträge des Kontakts werden in einem anonymen Typ zurückgegeben.
Using AWEntities As New AdventureWorksEntities
Dim contacts As ObjectQuery(Of Contact) = AWEntities.Contact
Dim ordersQuery = From contact In contacts _
Where contact.LastName = "Zhou" _
Select New With _
{.LastName = contact.LastName, _
.Orders = contact.SalesOrderHeader}
For Each order In ordersQuery
Console.WriteLine("Name: {0}", order.LastName)
For Each orderInfo In order.Orders
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue)
Next
Console.WriteLine("")
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Contact> contacts = AWEntities.Contact;
var ordersQuery = from contact in contacts
where contact.LastName == "Zhou"
select new { LastName = contact.LastName, Orders = contact.SalesOrderHeader };
foreach (var order in ordersQuery)
{
Console.WriteLine("Name: {0}", order.LastName);
foreach (SalesOrderHeader orderInfo in order.Orders)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue);
}
Console.WriteLine("");
}
}
Beispiel
Im folgenden Beispiel werden die SalesOrderHeader.Address-Navigationseigenschaft und die SalesOrderHeader.Contact-Navigationseigenschaft verwendet, um die Auflistung der jedem Auftrag zugeordneten Address-Objekte und Contact-Objekte abzurufen. Der Nachname des Kontakts, die Anschrift, die Auftragsnummer und der fällige Gesamtbetrag für jeden Auftrag nach Seattle werden in einem anonymen Typ zurückgegeben.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim ordersQuery = From order In orders _
Where order.Address.City = "Seattle" _
Select New With { _
.ContactLastName = order.Contact.LastName, _
.ContactFirstName = order.Contact.FirstName, _
.StreetAddress = order.Address.AddressLine1, _
.OrderNumber = order.SalesOrderNumber, _
.TotalDue = order.TotalDue}
For Each orderInfo In ordersQuery
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName)
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress)
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber)
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue)
Console.WriteLine("")
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var ordersQuery = from order in orders
where order.Address.City == "Seattle"
select new
{
ContactLastName = order.Contact.LastName,
ContactFirstName = order.Contact.FirstName,
StreetAddress = order.Address.AddressLine1,
OrderNumber = order.SalesOrderNumber,
TotalDue = order.TotalDue
};
foreach (var orderInfo in ordersQuery)
{
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName);
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress);
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber);
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue);
Console.WriteLine("");
}
}
Beispiel
Im folgenden Beispiel wird die Where-Methode verwendet, um Aufträge zu finden, die nach dem 1. Dezember 2003 eingegangen sind. Anschließend wird die order.SalesOrderDetail-Navigationseigenschaft verwendet, um die Details für jeden Auftrag abzurufen.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From order In orders _
Where order.OrderDate >= New DateTime(2003, 12, 1) _
Select order
Console.WriteLine("Orders that were made after December 1, 2003:")
For Each order In query
Console.WriteLine("OrderID {0} Order date: {1:d} ", _
order.SalesOrderID, order.OrderDate)
For Each orderDetail In order.SalesOrderDetail
Console.WriteLine(" Product ID: {0} Unit Price {1}", _
orderDetail.ProductID, orderDetail.UnitPrice)
Next
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> query =
from order in orders
where order.OrderDate >= new DateTime(2003, 12, 1)
select order;
Console.WriteLine("Orders that were made after December 1, 2003:");
foreach (SalesOrderHeader order in query)
{
Console.WriteLine("OrderID {0} Order date: {1:d} ",
order.SalesOrderID, order.OrderDate);
foreach (SalesOrderDetail orderDetail in order.SalesOrderDetail)
{
Console.WriteLine(" Product ID: {0} Unit Price {1}",
orderDetail.ProductID, orderDetail.UnitPrice);
}
}
}