Compartir por


Resultados de la consulta

Después de convertir una consulta LINQ to Entities en árboles de comandos y ejecutarse, los resultados de la consulta normalmente se devuelven como uno de los 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 CLR y se devuelven al cliente. La materialización de todos los objetos se realiza mediante Entity Framework. 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 de modelo conceptual primitivos, los resultados constan de tipos CLR independientes y desconectados de Entity Framework. Sin embargo, si la consulta devuelve una colección de objetos de entidad con tipo, representados por ObjectQuery<T>, el contexto del objeto realiza un seguimiento de esos tipos. Todo el comportamiento de los objetos (como colecciones secundarias o primarias, seguimiento de cambios, polimorfismo, etc.) se definen en Entity Framework. Esta funcionalidad se puede usar en su capacidad, tal como se define en Entity Framework. Para obtener más información, vea Trabajar con objetos.

Los tipos de estructura devueltos desde consultas (como tipos anónimos y tipos complejos que aceptan valores nulos) pueden tener un valor de null. Una propiedad de EntityCollection<TEntity> de una entidad devuelta también puede ser de valor null. Esto puede deberse a proyectar la propiedad de colección de una entidad con un valor null, como llamar a FirstOrDefault en un ObjectQuery<T> que no tiene elementos.

En determinadas situaciones, una consulta podría parecer generar un resultado materializado durante su ejecución, pero la consulta se ejecutará en el servidor y el objeto de entidad nunca se materializará en CLR. Esto puede causar problemas si depende de los efectos secundarios de la materialización de los objetos.

El ejemplo siguiente contiene una clase personalizada, MyContact, con una LastName propiedad . Cuando se establece la LastName propiedad, se incrementa una count variable. Si ejecuta las dos consultas siguientes, la primera consulta incrementará count, mientras que la segunda no lo hará. Esto se debe a que en la segunda consulta, la LastName propiedad se proyecta a partir de los resultados y la MyContact clase nunca se crea, porque no es necesario 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