Compartilhar via


Resultados da consulta

Depois que uma consulta LINQ to Entities é convertida para o comando de árvores 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 de CLR suportados pelo modelo conceitual.

  • Coleções internas.

  • Tipos anônimos.

Quando a consulta executar contra a fonte de dados, os resultados são materializados em tipos de CLR e retornados para o cliente. Qualquer materialização de objeto é executada pelo Entity Framework. Todos os erros que resultarem de uma incapacidade de mapear entre o Entity Framework e o CLR gerarão exceções durante a materialização do objeto.

Se a execução da consulta retorna tipos primitivos de modelo conceitual, os resultados consistem de tipos de CLR que são autônomos e desconectado de Entity Framework. No entanto, se a consulta retorna uma coleção de objetos de entidade tipados, representado por ObjectQuery<T>, os tipos são controlados pelo contexto de objeto. Todos objeto comportamento (como coleções pai/filho, controle de alterações, polimorfismo, e assim por diante) são como definido em Entity Framework. Essa funcionalidade pode ser usada em sua capacidade, conforme definido em Entity Framework. Para obter mais informações, confira Trabalhando com objetos.

Os tipos de Estrutura retornados de consultas (como tipos anônimos e tipos complexos anuláveis) podem ser de valor de null . Uma propriedade de EntityCollection<TEntity> de uma entidade retornado também pode ser o valor de null . Isso pode resultar de projetar a propriedade de coleção de uma entidade que é o valor de null , como chamar FirstOrDefault em ObjectQuery<T> que não tiver nenhum elemento.

Em determinadas situações, uma consulta pode parecer para produzir um resultado materializado durante sua execução, mas a consulta será executada no servidor e o objeto de entidade será materializado nunca em CLR. Isso pode causar problemas se você estiver como efeitos colaterais de materialization de objeto.

O exemplo a seguir contém uma classe personalizada, MyContact, com uma propriedade de LastName . Quando a propriedade de LastName é definida, uma variável de count é incrementado. Se você executa as duas consultas a seguir, a primeira consulta incrementará count quando a segunda consulta não. Isso ocorre porque na segunda consulta a propriedade de LastName é projetada de resultados e a classe de MyContact 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