Risultati delle query
Dopo che una query LINQ to Entities viene convertita in alberi dei comandi ed eseguita, i risultati della query vengono in genere restituiti in uno dei modi seguenti:
Raccolta di zero o più oggetti entità tipizzate o proiezione di tipi complessi nel modello concettuale.
Tipi CLR supportati dal modello concettuale.
Raccolte inline.
Tipi anonimi.
Una volta eseguita la query sull'origine dati, i risultati vengono materializzati in tipi CLR e restituiti al client. Tutta la materializzazione degli oggetti viene eseguita da Entity Framework. Qualsiasi errore correlato all'impossibilità di eseguire il mapping tra Entity Framework e CLR comporterà la generazione di eccezioni durante la materializzazione degli oggetti.
Se l'esecuzione della query restituisce tipi di modelli concettuali primitivi, i risultati sono costituiti da tipi CLR autonomi e disconnessi da Entity Framework. Se tuttavia la query restituisce una raccolta di oggetti entità tipizzati, rappresentati da ObjectQuery<T>, questi tipi vengono registrati dal contesto dell'oggetto. Tutti i comportamenti degli oggetti, ad esempio raccolte figlio/padre, rilevamento modifiche, polimorfismo e così via, sono definiti in Entity Framework. Questa funzionalità può essere usata nella sua capacità, come definito in Entity Framework. Per altre informazioni, vedere Uso di oggetti.
I tipi di struct restituiti dalle query (ad esempio tipi anonimi e tipi complessi che ammettono i valori Null) possono avere valore null
. Anche una proprietà EntityCollection<TEntity> di un'entità restituita può avere valore null
. Questo può essere dovuto alla proiezione della proprietà della raccolta di un'entità con valore null
, ad esempio la chiamata a FirstOrDefault su un oggetto ObjectQuery<T> che non dispone di elementi.
In alcune situazioni, potrebbe sembrare che una query generi un risultato materializzato durante la sua esecuzione, ma la query viene eseguita nel server e l'oggetto entità non viene mai materializzato in CLR. Questo può provocare problemi se si è legati agli effetti collaterali della materializzazione degli oggetti.
L'esempio seguente contiene una classe personalizzata, MyContact
, con una proprietà LastName
. Quando viene impostata la proprietà LastName
, viene incrementata una variabile count
. Se si eseguono le due query seguenti, tramite la prima query viene incrementata la variabile count
, mentre tramite la seconda query no. Questo avviene in quanto nella seconda query la proprietà LastName
è proiettata dai risultati e la classe MyContact
non viene mai creata, perché non è necessaria per eseguire la query sull'archivio.
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