Risultati delle query
Dopo che una query LINQ to Entities è stata convertita in una struttura ad albero dei comandi ed eseguita, i risultati della query vengono in genere restituiti in una delle forme 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. La materializzazione degli oggetti viene eseguita da Entity Framework . Qualsiasi errore dovuto all'impossibilità di eseguire il mapping tra Entity Framework e CLR comporta la generazione di eccezioni durante la materializzazione degli oggetti.
Se l'esecuzione di una query restituisce tipi primitivi del modello concettuale, 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, questi tipi vengono registrati dal contesto dell'oggetto. Tutti i comportamenti degli oggetti (ad esempio raccolte figlio/padre, rilevamento delle modifiche, polimorfismo e così via) sono conformi a quanto definito in Entity Framework . Questa funzionalità può essere utilizzata come definito in Entity Framework . Per ulteriori informazioni, vedere Utilizzo di oggetti (Entity Framework).
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 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 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 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 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 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
public class MyContact
{
String _lastName;
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
count++;
}
}
}