Resultados de la consultaQuery Results

Después de una consulta LINQ to Entities se convierten en árboles de comandos y se ejecuta, los resultados de consulta se devuelven normalmente como uno de los siguientes:After a LINQ to Entities query is converted to command trees and executed, the query results are usually returned as one of the following:

  • Una colección con cero o más objetos entidad con tipo o una proyección de tipos complejos en el modelo conceptual.A collection of zero or more typed entity objects or a projection of complex types in the conceptual model.

  • Tipos CLR admitidos por el modelo conceptual.CLR types supported by the conceptual model.

  • Colecciones insertadas.Inline collections.

  • Tipos anónimos.Anonymous types.

Cuando la consulta se ha ejecutado en el origen de datos, los resultados se materializan en tipos de CLR y se devuelven al cliente.When the query has executed against the data source, the results are materialized into CLR types and returned to the client. Entity FrameworkEntity Framework realiza la materialización de todos los objetos.All object materialization is performed by the Entity FrameworkEntity Framework. Los errores derivados de la imposibilidad de realizar asignaciones entre Entity FrameworkEntity Framework y CLR hará que se produzcan excepciones durante la materialización de los objetos.Any errors that result from an inability to map between the Entity FrameworkEntity Framework and the CLR will cause exceptions to be thrown during object materialization.

Si la ejecución de la consulta devuelve tipos primitivos del modelo conceptual, los resultados están compuestos de tipos de CLR que son independientes y están desconectados de Entity FrameworkEntity Framework.If the query execution returns primitive conceptual model types, the results consist of CLR types that are stand-alone and disconnected from the Entity FrameworkEntity Framework. Sin embargo, si la consulta devuelve una colección de objetos entidad con tipo, representada por ObjectQuery<T>, dichos tipos son sometidos a seguimiento por el contexto del objeto.However, if the query returns a collection of typed entity objects, represented by ObjectQuery<T>, those types are tracked by the object context. Todos los comportamientos de objeto (por ejemplo, las colecciones de elementos primarios y secundarios, seguimiento de cambios, polimorfismo etc.) son como se define en el Entity FrameworkEntity Framework.All object behavior (such as child/parent collections, change tracking, polymorphism, and so on) are as defined in the Entity FrameworkEntity Framework. Esta funcionalidad se puede utilizar en su capacidad, como se define en Entity FrameworkEntity Framework.This functionality can be used in its capacity, as defined in the Entity FrameworkEntity Framework. Para obtener más información, consulte trabajar con objetos.For more information, see Working with Objects.

Los tipos struct devueltos en las consultas (como tipos anónimos y tipos complejos que aceptan valores NULL) pueden ser de valor null.Struct types returned from queries (such as anonymous types and nullable complex types) can be of null value. Una propiedad de EntityCollection<TEntity> de una entidad devuelta también puede ser de valor null.An EntityCollection<TEntity> property of a returned entity can also be of null value. Esto puede deberse a la proyección de la propiedad de colección de una entidad que es de valor null, como la llamada a FirstOrDefault en una ObjectQuery<T> que no tiene elementos.This can result from projecting the collection property of an entity that is of null value, such as calling FirstOrDefault on an ObjectQuery<T> that has no elements.

En determinadas situaciones, puede que parezca que una consulta genera un resultado materializado durante su ejecución, pero la consulta se ejecutará en el servidor y el objeto entidad nunca se materializará en CLR.In certain situations, a query might appear to generate a materialized result during its execution, but the query will be executed on the server and the entity object will never be materialized in the CLR. Esto puede producir problemas si se está dependiendo de los efectos secundarios de la materialización de los objetos.This can cause problems if you are depending on side effects of object materialization.

El ejemplo siguiente contiene una clase personalizada, MyContact, con una propiedad LastName.The following example contains a custom class, MyContact, with a LastName property. Cuando se establece la propiedad LastName, se incrementa una variable count.When the LastName property is set, a count variable is incremented. Si ejecuta las dos consultas siguientes, la primera consulta incrementará count mientras que la segunda consulta no lo hará.If you execute the two following queries, the first query will increment count while the second query will not. Esto de debe a que en la segunda consulta la propiedad LastName se proyecta desde los resultados y nunca se crea la clase MyContact, porque no se requiere ejecutar la consulta en el almacén.This is because in the second query the LastName property is projected from the results and the MyContact class is never created, because it is not required to execute the query on the store.

public static int count = 0;

static void Main(string[] args)
{
    using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
    {

        var query1 = AWEntities
           .Contacts
           .Where(c => c.LastName == "Jones")
           .Select(c => new MyContact { LastName = c.LastName });

        // Execute the first query and print the count.
        query1.ToList();
        Console.WriteLine("Count: " + count);

        //Reset the count variable.
        count = 0;

        var query2 = AWEntities
           .Contacts
           .Where(c => c.LastName == "Jones")
           .Select(c => new MyContact { LastName = c.LastName })
           .Select(my => my.LastName);

        // Execute the second query and print the count.
        query2.ToList();
        Console.WriteLine("Count: " + count);

    }

    Console.WriteLine("Hit enter...");
    Console.Read();
}
Public count As Integer = 0

Sub Main()

    Using AWEntities As New AdventureWorksEntities()

        Dim query1 = AWEntities.Contacts _
        .Where(Function(c) c.LastName = "Jones") _
        .Select(Function(c) New MyContact With {.LastName = c.LastName})

        ' Execute the first query and print the count.
        query1.ToList()
        Console.WriteLine("Count: " & count)

        ' Reset the count variable.
        count = 0

        Dim query2 = AWEntities _
        .Contacts() _
        .Where(Function(c) c.LastName = "Jones") _
        .Select(Function(c) New MyContact With {.LastName = c.LastName}) _
        .Select(Function(x) x.LastName)

        ' Execute the second query and print the count.
        query2.ToList()
        Console.WriteLine("Count: " & count)

    End Using
End Sub
public class MyContact
{

    String _lastName;

    public string LastName
    {
        get
        {
            return _lastName;
        }

        set
        {
            _lastName = value;
            count++;
        }
    }
}
Public Class MyContact

    Private _lastName As String

    Public Property LastName() As String
        Get
            Return _lastName
        End Get

        Set(ByVal value As String)
            _lastName = value
            count += 1
        End Set
    End Property

End Class