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