Compartir a través de


Consultas de objeto [Entity Framework]

La clase ObjectQuery genérica representa una consulta que devuelve una colección de cero o más objetos entidad con tipo. Una consulta de objeto siempre pertenece al contexto de un objeto existente. Este contexto proporciona la información de metadatos y de conexión necesaria para crear y ejecutar la consulta. Un ObjectContext con tipo incluye un conjunto de propiedades que devuelven las instancias ObjectQuery con tipo. Hay una de estas propiedades para cada tipo de entidad en el modelo. Estas propiedades facilitan la creación de una instancia de un ObjectQuery con tipo. Una consulta de objeto se ejecuta en los escenarios siguientes:

  • Cuando se actúa sobre ella; por ejemplo, durante una enumeración foreach (C#) o For Each (Visual Basic).

  • Cuando se asigna para rellenar una colección List.

  • Cuando se llama explícitamente al método Execute.

  • Cuando se llama a un operador de ejecución de consultas LINQ, como First o Any. Para obtener más información, vea Métodos del generador de consultas (Entity Framework).

La consulta siguiente devuelve un objeto Contact en el que los parámetros pasados especifican el nombre y el apellido:

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

Para obtener ejemplos completos acerca de cómo usar el contexto del objeto para crear y ejecutar consultas, vea Cómo ejecutar una consulta que devuelve un tipo de entidad (Entity Framework). Para obtener más información acerca de las consultas de Entity SQL, vea Lenguaje Entity SQL.

Proyección de consultas

Aunque las consultas de objeto se usan para devolver datos de Entity Data Model (EDM) como objetos entidad, también admiten proyecciones que devuelven datos que no se pueden materializar con facilidad en tipos de entidad. ObjectQuery usa el tipo DbDataRecord para las proyecciones que devuelven tipos sin entidad y que pueden ser resultados anidados o tipos anónimos. Los tipos simples, como Int32 o String, se usan con proyecciones que devuelven valores de propiedad únicos.

El método del generador de consultas Select devuelve una ObjectQuery que, cuando se ejecuta, devuelve una colección de objetos DbDataRecord. Tanto LINQ to Entities como Entity SQL admiten la proyección de consultas. Vea los temas siguientes para obtener ejemplos de proyección de consultas:

Las consideraciones siguientes se aplican a las proyecciones de consultas:

  • Se puede inicializar ObjectQuery para que represente un único resultado escalar y no una colección de resultados escalares. Algunos métodos de extensión requieren el uso de los resultados de la colección como entrada. En este caso, cuando se llama a uno de estos métodos, se inicia una instancia de ArgumentException, como en el ejemplo siguiente.

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • Si ObjectQuery puede devolver un valor null cuando se proyecta a un tipo primitivo, se debe utilizar la versión que acepta valores NULL del tipo. La consulta siguiente utiliza un elemento DateTime que acepta valores NULL porque la propiedad ShipDate del objeto SalesOrderHeader puede devolver un valor null.

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    Para obtener más información, vea Tipos que aceptan valores NULL (Guía de programación de Visual Basic) o Tipos que aceptan valores NULL (Guía de programación de C#).

Establecer el tiempo de espera del comando

El proveedor de conexiones subyacente define el tiempo de espera predeterminado para las consultas de objeto y la operación SaveChanges. Sin embargo, puede invalidar este valor de tiempo de espera predeterminado con la propiedad CommandTimeout de ObjectContext, tal y como se muestra en el ejemplo siguiente.

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

Haga esto cuando tenga una consulta compleja o cuando otros problemas de rendimiento sean la causa de que, con frecuencia, se agote el tiempo de espera de las consultas o de las llamadas a SaveChanges.

Ver comandos de almacenamiento

Cuando se consulta un modelo EDM, Entity Framework transforma la consulta LINQ to Entities y Entity SQL basada en EDM en una consulta equivalente que se realiza en el origen de datos. Los Servicios de objeto proporcionan el método ToTraceString, que permite ver estos comandos de almacenamiento para una ObjectQuery en tiempo de ejecución sin necesidad de realizar un seguimiento en el origen de datos. El proveedor de EntityClient también proporciona un método ToTraceString en EntityCommand. Para obtener más información, vea Cómo ver los comandos de almacenamiento (Entity Framework).

Recuperar un objeto por su EntityKey

Si conoce el valor de clave de una entidad, puede recuperarlo del origen de datos sin necesidad de crear ni ejecutar explícitamente una consulta de objeto. Los métodos GetObjectByKey y TryGetObjectByKey de ObjectContext devolverán un objeto con la EntityKey especificada en el contexto del objeto. Si usa GetObjectByKey, deberá controlar una ObjectNotFoundException cuando la EntityKey proporcionada no corresponda a ninguna entidad existente. Para obtener más información, vea Cómo devolver un objeto concreto usando su clave (Entity Framework).

Vea también

Conceptos

Consultar datos como objetos (Entity Framework)