Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las propiedades de navegación de Entity Framework son propiedades de método abreviado que se usan para buscar las entidades en los extremos de una asociación. Las propiedades de navegación permiten a un usuario navegar de una entidad a otra, o de una entidad a entidades relacionadas a través de un conjunto de asociaciones. En este tema se proporcionan ejemplos de sintaxis de expresiones de consulta sobre cómo navegar por las relaciones a través de las propiedades de navegación en las consultas LINQ to Entities.
El modelo de ventas de AdventureWorks usado en estos ejemplos se compila a partir de las tablas Contact, Address, Product, SalesOrderHeader y SalesOrderDetail de la base de datos de ejemplo AdventureWorks.
Los ejemplos de este tema utilizan las siguientes instrucciones using
/Imports
:
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
Ejemplo 1
En el ejemplo siguiente se usa el Select método para obtener todos los identificadores de contacto y la suma del total debido para cada contacto cuyo apellido es "Zhou". La Contact.SalesOrderHeader
propiedad de navegación se usa para obtener la colección de SalesOrderHeader
objetos para cada contacto. El método Sum
usa la propiedad de navegación Contact.SalesOrderHeader
para sumar el importe total a pagar de todos los pedidos de cada contacto.
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: {contact.ContactID} Orders total: {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
Ejemplo 2
En el ejemplo siguiente se obtienen todos los pedidos de los contactos cuyo apellido es "Zhou". La Contact.SalesOrderHeader
propiedad de navegación se usa para obtener la colección de SalesOrderHeader
objetos para cada contacto. El nombre y los pedidos del contacto se devuelven en un tipo anónimo.
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: {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
Ejemplo 3
En el siguiente ejemplo, se utilizan las propiedades de navegación SalesOrderHeader.Address
y SalesOrderHeader.Contact
para obtener la colección de objetos Address
y Contact
asociados con cada orden. El apellido del contacto, la dirección postal, el número de pedido de venta y el total debido por cada pedido a la ciudad de Seattle se devuelven en un tipo anónimo.
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: {orderInfo.StreetAddress}");
Console.WriteLine($"Order number: {orderInfo.OrderNumber}");
Console.WriteLine($"Total Due: {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
Ejemplo 4
En el ejemplo siguiente se usa el Where
método para buscar pedidos realizados después del 1 de diciembre de 2003 y, a continuación, se usa la order.SalesOrderDetail
propiedad de navegación para obtener los detalles de cada pedido.
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 {order.SalesOrderID} Order date: {order.OrderDate:d} ");
foreach (SalesOrderDetail orderDetail in order.SalesOrderDetails)
{
Console.WriteLine($" Product ID: {orderDetail.ProductID} Unit Price {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