Share via


Voorbeelden van op methoden gebaseerde querysyntaxis: Door relaties navigeren

Navigatie-eigenschappen in Entity Framework zijn snelkoppelingseigenschappen die worden gebruikt om de entiteiten aan het einde van een koppeling te vinden. Met navigatie-eigenschappen kan een gebruiker van de ene entiteit naar de andere navigeren of van de ene entiteit naar gerelateerde entiteiten via een koppelingsset. Dit onderwerp bevat voorbeelden in op methoden gebaseerde querysyntaxis van het navigeren door relaties via navigatie-eigenschappen in LINQ naar entiteitenquery's.

Het AdventureWorks Sales Model dat in deze voorbeelden wordt gebruikt, is gebaseerd op de tabellen Contact, Adres, Product, SalesOrderHeader en SalesOrderDetail in de voorbeelddatabase AdventureWorks.

In de voorbeelden in dit onderwerp worden de volgende using/Imports instructies gebruikt:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Globalization;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Data.Common;

Option Explicit On
Option Strict On
Imports System.Data.Objects
Imports System.Globalization

Voorbeeld 1

In het volgende voorbeeld in de querysyntaxis op basis van een methode wordt de SelectMany methode gebruikt om alle orders van de contactpersonen op te halen waarvan de achternaam 'Zhou' is. De Contact.SalesOrderHeader navigatie-eigenschap wordt gebruikt om de verzameling SalesOrderHeader objecten voor elke contactpersoon op te halen.

string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> ordersQuery = context.Contacts
        .Where(c => c.LastName == lastName)
        .SelectMany(c => c.SalesOrderHeaders);

    foreach (var order in ordersQuery)
    {
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
            order.SalesOrderID, order.OrderDate, order.TotalDue);
    }
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
    Dim ordersQuery = context.Contacts _
    .Where(Function(c) c.LastName = lastName) _
    .SelectMany(Function(o) o.SalesOrderHeaders)

    For Each order In ordersQuery
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
                order.SalesOrderID, order.OrderDate, order.TotalDue)
    Next
End Using

Voorbeeld 2

In het volgende voorbeeld in de querysyntaxis op basis van een methode wordt de Select methode gebruikt om alle contact-id's op te halen en de som van het totale verschuldigde bedrag voor elke contactpersoon waarvan de achternaam 'Zhou' is. De Contact.SalesOrderHeader navigatie-eigenschap wordt gebruikt om de verzameling SalesOrderHeader objecten voor elke contactpersoon op te halen. De Sum methode gebruikt de Contact.SalesOrderHeader navigatie-eigenschap om het totaal te berekenen van alle orders voor elke contactpersoon.

string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var ordersQuery = context.Contacts
        .Where(c => c.LastName == lastName)
        .Select(c => new
        {
            ContactID = c.ContactID,
            Total = c.SalesOrderHeaders.Sum(o => o.TotalDue)
        });

    foreach (var contact in ordersQuery)
    {
        Console.WriteLine("Contact ID: {0} Orders total: {1}", contact.ContactID, contact.Total);
    }
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
    Dim ordersQuery = context.Contacts _
    .Where(Function(c) c.LastName = lastName) _
    .Select(Function(c) New With _
                {.ContactID = c.ContactID, _
                .Total = c.SalesOrderHeaders.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

Voorbeeld 3

In het volgende voorbeeld in de querysyntaxis op basis van een methode worden alle orders opgehaald van de contactpersonen waarvan de achternaam 'Zhou' is. De Contact.SalesOrderHeader navigatie-eigenschap wordt gebruikt om de verzameling SalesOrderHeader objecten voor elke contactpersoon op te halen. De naam en orders van de contactpersoon worden geretourneerd in een anoniem type.

string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var ordersQuery = context.Contacts
        .Where(c => c.LastName == lastName)
        .Select(c => new { LastName = c.LastName, Orders = c.SalesOrderHeaders });

    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("");
    }
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
    Dim ordersQuery = context.Contacts _
    .Where(Function(c) c.LastName = lastName) _
    .Select(Function(o) New With _
                {.LastName = o.LastName, _
                 .Orders = o.SalesOrderHeaders})

    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

Voorbeeld 4

In het volgende voorbeeld worden de SalesOrderHeader.Address eigenschappen en SalesOrderHeader.Contact navigatie gebruikt om de verzameling Address en Contact objecten op te halen die aan elke order zijn gekoppeld. De achternaam van de contactpersoon, het adres, het verkoopordernummer en het totale verschuldigde bedrag voor elke order aan de stad Seattle worden geretourneerd in een anoniem type.

string city = "Seattle";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var ordersQuery = context.SalesOrderHeaders
        .Where(o => o.Address.City == city)
        .Select(o => new
        {
            ContactLastName = o.Contact.LastName,
            ContactFirstName = o.Contact.FirstName,
            StreetAddress = o.Address.AddressLine1,
            OrderNumber = o.SalesOrderNumber,
            TotalDue = o.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("");
    }
}
Dim city = "Seattle"
Using context As New AdventureWorksEntities
    Dim ordersQuery = context.SalesOrderHeaders _
             .Where(Function(o) o.Address.City = city) _
             .Select(Function(o) New With { _
                            .ContactLastName = o.Contact.LastName, _
                            .ContactFirstName = o.Contact.FirstName, _
                            .StreetAddress = o.Address.AddressLine1, _
                            .OrderNumber = o.SalesOrderNumber, _
                            .TotalDue = o.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

Voorbeeld 5

In het volgende voorbeeld wordt de Where methode gebruikt om orders te vinden die na 1 december 2003 zijn gemaakt en vervolgens de order.SalesOrderDetail navigatie-eigenschap gebruikt om de details voor elke order op te halen.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> query =
        from order in context.SalesOrderHeaders
        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.SalesOrderDetails)
        {
            Console.WriteLine("  Product ID: {0} Unit Price {1}",
                orderDetail.ProductID, orderDetail.UnitPrice);
        }
    }
}
Using context As New AdventureWorksEntities
    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders

    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.SalesOrderDetails
            Console.WriteLine("  Product ID: {0} Unit Price {1}", _
                orderDetail.ProductID, orderDetail.UnitPrice)
        Next
    Next
End Using

Zie ook