Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dopo che una query LINQ to Entities è stata convertita in un albero dei comandi ed eseguita, i risultati della query vengono in genere restituiti in una delle forme seguenti:
Insieme di zero o più oggetti entità tipizzati o proiezione di tipi complessi in EDM.
Tipi CLR supportati da EDM.
Insiemi 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 EDM primitivi, i risultati sono costituiti da tipi CLR autonomi e disconnessi da Entity Framework. Se tuttavia la query restituisce un insieme di oggetti entità tipizzati, rappresentati da ObjectQuery, questi tipi vengono registrati dal contesto dell'oggetto. Tutti i comportamenti degli oggetti (ad esempio insiemi 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 Cenni preliminari su Object Services (Entity Framework).
I tipi di struttura 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à dell'insieme 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.Contact _
.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 _
.Contact() _
.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
.Contact
.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
.Contact
.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++;
}
}
}