Compartir a través de


Propiedades de navegación

Las propiedades de navegación de Entity Data Model son propiedades de acceso directo que se emplean para localizar las entidades en los extremos de una asociación. Las propiedades de navegación permiten navegar de una entidad a otra, o de una entidad a entidades relacionadas a través de un conjunto de asociaciones. Las propiedades de navegación se pueden utilizar en las consultas de Entity SQL y en las consultas de LINQ to Entities. Permiten el acceso a las entidades relacionadas sin necesidad de realizar una operación JOIN. Para obtener más información, vea Propiedades de navegación (EDM).

En el ejemplo siguiente de la sintaxis de consulta basada en métodos se usa el método SelectMany para obtener todos los pedidos de los contactos cuyo apellido es "Zhou". La propiedad de navegación Contact.SalesOrderHeader se utiliza para obtener la colección de objetos SalesOrderHeader para cada contacto.

Using AWEntities As New AdventureWorksEntities
    Dim ordersQuery = AWEntities.Contact _
    .Where(Function(c) c.LastName = "Zhou") _
    .SelectMany(Function(o) o.SalesOrderHeader)

    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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> ordersQuery = AWEntities.Contact
        .Where(c => c.LastName == "Zhou")
        .SelectMany(c => c.SalesOrderHeader);

    foreach (var order in ordersQuery)
    {
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
            order.SalesOrderID, order.OrderDate, order.TotalDue);
    }
}

Las propiedades de navegación también aparecen en las instancias de las entidades en el CLR, lo que permite cargar las entidades relacionadas llamando al método Load. Al cargar una entidad en el CLR, debería cargar explícitamente las propiedades de navegación antes de tener acceso a los miembros de la entidad. Cargar estas propiedades evita viajes de ida y vuelta (round trip) inesperados al origen de datos. Sin embargo, las consultas de LINQ to Entities se evalúan en el origen de datos, por lo que no son necesarios viajes de ida y vuelta adicionales y la propiedad actúa como marcador de posición para una expresión de navegación más compleja.

Puede cargar explícitamente las propiedades de navegación dentro de un bucle foreach/For Each si MultipleActiveResultSets=True se establece en la cadena de conexión. Si la cadena de conexión contiene MultipleActiveResultSets=False, la llamada al método Load en el ejemplo siguiente generará una EntityCommandExecutionException.

Using AWEntities As New AdventureWorksEntities()
    Dim contacts = _
        AWEntities.Contact _
        .Where(Function(c) c.LastName = "Johnson") _
        .Select(Function(c) c)

    Try
        For Each contact As Contact In contacts

            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName)

            ' Throws a EntityCommandExecutionException if 
            ' MultipleActiveResultSets is set to False in the 
            ' connection string.
            contact.SalesOrderHeader.Load()

            For Each order As SalesOrderHeader In contact.SalesOrderHeader
                Console.WriteLine("Order ID: {0}", order.SalesOrderID)
            Next

        Next
    Catch ex As EntityCommandExecutionException

        Console.WriteLine(ex.InnerException)
    End Try
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<Contact> contacts =
            AWEntities.Contact
            .Where(c => c.LastName == "Johnson")
            .Select(c => c);

    try
    {

        foreach (Contact contact in contacts)
        {
            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName);
            
            // Throws a EntityCommandExecutionException if 
            // MultipleActiveResultSets is set to False in the 
            // connection string.
            contact.SalesOrderHeader.Load();

            foreach (SalesOrderHeader order in contact.SalesOrderHeader)
            {
                Console.WriteLine("Order ID: {0}", order.SalesOrderID);
            }
        }
    }
    catch (EntityCommandExecutionException ex)
    {
        Console.WriteLine(ex.InnerException);
    }
}

Vea también

Conceptos

Ejemplos de sintaxis de consulta basada en métodos: navegar por relaciones (LINQ to Entities)
Expresiones en consultas de LINQ to Entities