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