Udostępnij za pośrednictwem


Przykłady składni wyrażeń zapytania, nawigowanie po relacjach

Właściwości nawigacji w programie Entity Framework są właściwościami skrótów używanymi do lokalizowania jednostek na końcach skojarzenia. Właściwości nawigacji umożliwiają użytkownikowi przechodzenie z jednej jednostki do innej lub z jednej jednostki do powiązanych jednostek za pośrednictwem zestawu skojarzeń. Ten temat zawiera przykłady składni wyrażeń zapytania dotyczące sposobu nawigowania po relacjach za pośrednictwem właściwości nawigacji w zapytaniach LINQ to Entities.

Model AdventureWorks Sales używany w tych przykładach jest tworzony na podstawie tabel Contact, Address, Product, SalesOrderHeader i SalesOrderDetail w przykładowej bazie danych AdventureWorks.

W przykładach w tym temacie są używane następujące using/Imports instrukcje:

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

Przykład 1

W poniższym przykładzie Select użyto metody , aby pobrać wszystkie identyfikatory kontaktów i sumę sumy należnej dla każdego kontaktu, którego nazwisko to "Zhou". Właściwość Contact.SalesOrderHeader nawigacji służy do pobierania kolekcji SalesOrderHeader obiektów dla każdego kontaktu. Metoda Sum używa Contact.SalesOrderHeader właściwości nawigacji, aby zsumować sumę wszystkich zamówień dla każdego kontaktu.

string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<Contact> contacts = context.Contacts;

    var ordersQuery = from contact in contacts
                      where contact.LastName == lastName
                      select new
                      {
                          ContactID = contact.ContactID,
                          Total = contact.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 contacts As ObjectSet(Of Contact) = context.Contacts

    Dim ordersQuery = From contact In contacts _
                      Where contact.LastName = lastName _
                      Select New With _
                              {.ContactID = contact.ContactID, _
                              .Total = contact.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

Przykład 2

Poniższy przykład pobiera wszystkie zamówienia kontaktów, których nazwisko to "Zhou". Właściwość Contact.SalesOrderHeader nawigacji służy do pobierania kolekcji SalesOrderHeader obiektów dla każdego kontaktu. Nazwa i zamówienia kontaktu są zwracane w typie anonimowym.

string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<Contact> contacts = context.Contacts;

    var ordersQuery = from contact in contacts
                      where contact.LastName == lastName
                      select new { LastName = contact.LastName, Orders = contact.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 contacts As ObjectSet(Of Contact) = context.Contacts

    Dim ordersQuery = From contact In contacts _
                      Where contact.LastName = lastName _
                      Select New With _
                              {.LastName = contact.LastName, _
                               .Orders = contact.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

Przykład 3

W poniższym przykładzie użyto SalesOrderHeader.Address właściwości nawigacji i SalesOrderHeader.Contact pobierz kolekcję Address obiektów i Contact skojarzonych z poszczególnymi zamówieniami. Nazwisko kontaktu, adres ulicy, numer zamówienia sprzedaży i łączna kwota należna dla każdego zamówienia w Seattle są zwracane w anonimowym typie.

string city = "Seattle";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;

    var ordersQuery = from order in orders
                      where order.Address.City == city
                      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("");
    }
}
Dim city = "Seattle"
Using context As New AdventureWorksEntities

    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders

    Dim ordersQuery = From order In orders _
                      Where order.Address.City = city _
                      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

Przykład 4

W poniższym przykładzie Where użyto metody , aby znaleźć zamówienia, które zostały wykonane po 1 grudnia 2003 r., a następnie używa order.SalesOrderDetail właściwości nawigacji, aby uzyskać szczegóły dla każdego zamówienia.

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

Zobacz też