Partilhar via


Resultados da consulta

Depois que uma consulta LINQ to Entities é convertida em árvores de comando e executada, os resultados da consulta geralmente são retornados como um dos seguintes:

  • Uma coleção de zero ou mais objetos de entidade tipados ou uma projeção de tipos complexos no modelo conceitual.

  • Tipos CLR suportados pelo modelo conceitual.

  • Coleções em linha.

  • Tipos anônimos.

Quando a consulta é executada na fonte de dados, os resultados são materializados em tipos CLR e retornados ao cliente. Toda a materialização de objetos é realizada pelo Entity Framework. Quaisquer erros resultantes de uma incapacidade de mapear entre o Entity Framework e o CLR farão com que exceções sejam lançadas durante a materialização do objeto.

Se a execução da consulta retornar tipos de modelo conceitual primitivos, os resultados consistirão em tipos CLR autônomos e desconectados do Entity Framework. No entanto, se a consulta retornar uma coleção de objetos de entidade tipados, representados por ObjectQuery<T>, esses tipos serão rastreados pelo contexto do objeto. Todo o comportamento do objeto (como coleções filho/pai, controle de alterações, polimorfismo e assim por diante) é conforme definido no Entity Framework. Essa funcionalidade pode ser usada em sua capacidade, conforme definido no Entity Framework. Para obter mais informações, consulte Trabalhando com objetos.

Os tipos struct retornados de consultas (como tipos anônimos e tipos complexos anuláveis) podem ser valiosos null . Uma EntityCollection<TEntity> propriedade de uma entidade retornada null também pode ter valor. Isso pode resultar da projeção da propriedade de coleção de uma entidade que é de null valor, como chamar FirstOrDefault uma ObjectQuery<T> que não tem elementos.

Em determinadas situações, uma consulta pode parecer gerar um resultado materializado durante sua execução, mas a consulta será executada no servidor e o objeto de entidade nunca será materializado no CLR. Isso pode causar problemas se você estiver dependendo dos efeitos colaterais da materialização do objeto.

O exemplo a seguir contém uma classe personalizada, MyContact, com uma LastName propriedade. Quando a LastName propriedade é definida, uma count variável é incrementada. Se você executar as duas consultas a seguir, a primeira consulta será incrementada count , enquanto a segunda consulta não. Isso ocorre porque na segunda consulta a LastName propriedade é projetada a partir dos resultados e a MyContact classe nunca é criada, porque não é necessário executar a consulta no armazenamento.

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