Resultados de la consulta

Después de que una consulta de LINQ to Entities se convierta en árboles de comandos y se ejecute, los resultados de la consulta se devuelven normalmente como uno de los tipos siguientes:

  • Una colección con cero o más objetos entidad con tipo o una proyección de tipos complejos en el modelo conceptual.

  • Tipos CLR admitidos por el modelo conceptual.

  • Colecciones insertadas.

  • Tipos anónimos.

Cuando la consulta se ha ejecutado en el origen de datos, los resultados se materializan en tipos de CLR y se devuelven al cliente. Entity Framework realiza la materialización de todos los objetos. Los errores derivados de la incapacidad de encontrar una correspondencia entre Entity Framework y CLR hará que se produzcan excepciones durante la materialización de los objetos.

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 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. El comportamiento de todos los objetos (como colecciones de elementos primarios y secundarios, seguimiento de cambios, polimorfismo, etc.) es como el que se define en Entity Framework. Esta funcionalidad se puede utilizar en su capacidad, como se define en Entity Framework. Para obtener más información, vea Trabajar con objetos.

Los tipos struct devueltos en las consultas (como tipos anónimos y tipos complejos que aceptan valores NULL) pueden ser de valor null. Una propiedad de EntityCollection<TEntity> de una entidad devuelta también puede ser de valor null. 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.

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. Esto puede producir problemas si se está dependiendo de los efectos secundarios de la materialización de los objetos.

El ejemplo siguiente contiene una clase personalizada, MyContact, con una propiedad LastName. Cuando se establece la propiedad LastName, se incrementa una variable count. Si ejecuta las dos consultas siguientes, la primera consulta incrementará count mientras que la segunda consulta no lo hará. 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.

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