Condividi tramite


Query di oggetto (Entity Framework)

La classe generica ObjectQuery rappresenta una query che restituisce un insieme di zero o più oggetti entità tipizzati. Una query di oggetto appartiene sempre a un contesto dell'oggetto esistente. Il contesto fornisce le informazioni relative a connessione e metadati necessarie per comporre ed eseguire la query. Un ObjectContext tipizzato include un set di proprietà che restituiscono istanze ObjectQuery tipizzate. Per ogni tipo di entità nel modello è disponibile una di queste proprietà. Tali proprietà semplificano la creazione di un'istanza di un ObjectQuery tipizzato. Una query di oggetto viene eseguita negli scenari seguenti:

  • Quando viene utilizzata, ad esempio durante un'enumerazione foreach (C#) o For Each (Visual Basic).

  • Quando viene assegnata per il riempimento di un insieme List.

  • Quando il metodo Execute viene chiamato esplicitamente.

  • Quando viene chiamato un operatore di esecuzione di query LINQ, ad esempio First o Any. Per ulteriori informazioni, vedere Metodi del generatore di query (Entity Framework).

La query seguente restituisce un oggetto Contact in cui il nome e il cognome sono specificati dai parametri passati:

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

Per esempi completi di come utilizzare il contesto dell'oggetto per creare ed eseguire query, vedere Procedura: eseguire una query che restituisce un tipo di entità (Entity Framework). Per ulteriori informazioni sulle query Entity SQL, vedere Linguaggio Entity SQL.

Proiezione di query

Sebbene le query di oggetto siano utilizzate per restituire i dati Entity Data Model (EDM) come oggetti entità, tali query supportano anche proiezioni che restituiscono dati che non possono essere materializzati in modo semplice in tipi di entità. ObjectQuery utilizza il tipo DbDataRecord per proiezioni che restituiscono tipi non entità che possono essere tipi anonimi o risultati nidificati. I tipi semplici, ad esempio Int32 o String, vengono utilizzati con le proiezioni che restituiscono valori di proprietà singoli.

Il metodo Select del generatore di query restituisce un oggetto ObjectQuery che, quando viene eseguito, restituisce un insieme di oggetti DbDataRecord. LINQ to Entities e Entity SQL supportano entrambi la proiezione di query. Per esempi di proiezione di query, vede gli argomenti seguenti:

Le considerazioni seguenti riguardano le proiezioni di query:

  • È possibile inizializzare un oggetto ObjectQuery in modo che rappresenti un singolo risultato scalare e non un insieme di risultati scalari. Alcuni metodi di estensione richiedono come input risultati costituiti da un insieme. In questo caso, quando uno di questi metodi viene chiamato, viene generata un'eccezione ArgumentException, come nell'esempio seguente.

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • Se un oggetto ObjectQuery può restituire un valore null quando proiettato in un tipo primitivo, è necessario utilizzare la versione del tipo che ammette i valori Null. Nella query seguente viene utilizzato un oggetto DateTime che ammette i valori Null perché la proprietà ShipDate dell'oggetto SalesOrderHeader potrebbe restituire un valore null.

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    Per ulteriori informazioni, vedere l'argomento relativo ai tipi che ammettono i valori Null nella Guida per programmatori Visual Basic o l'argomento Tipi nullable (Guida per programmatori C#).

Impostazione del timeout del comando

Il timeout predefinito per le query di oggetto e l'operazione SaveChanges è definito dal provider di connessione sottostante. È tuttavia possibile eseguire l'override di questo valore di timeout predefinito utilizzando la proprietà CommandTimeout in ObjectContext, come illustrato nell'esempio seguente.

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

Eseguire questa operazione in presenza di una query complessa o quando altri problemi di prestazioni provocano il timeout frequente delle query o delle chiamate a SaveChanges.

Visualizzazione di comandi di archiviazione

Quando si esegue una query su EDM, in Entity Framework le query LINQ to Entities e Entity SQL basate su EDM vengono trasformate in query equivalenti sull'origine dati. Object Services fornisce il metodo ToTraceString che consente di visualizzare questi comandi di archiviazione per un oggetto ObjectQuery in fase di esecuzione senza dovere eseguire un'analisi nell'origine dati. Il provider EntityClient fornisce inoltre un metodo ToTraceString su EntityCommand. Per ulteriori informazioni, vedere Procedura: visualizzare i comandi di archiviazione (Entity Framework).

Recupero di un oggetto tramite EntityKey

Se si conosce il valore della chiave di un'entità, è possibile recuperarla dall'origine dati senza creare ed eseguire in modo esplicito una query di oggetto. I metodi GetObjectByKey e TryGetObjectByKey su ObjectContext restituiscono un oggetto con EntityKey specificato nel contesto dell'oggetto. Quando si utilizza GetObjectByKey, è necessario gestire un'eccezione ObjectNotFoundException quando l'oggetto EntityKey fornito non corrisponde a un'entità esistente. Per ulteriori informazioni, vedere Procedura: restituire un oggetto specifico utilizzando la relativa chiave (Entity Framework).

Vedere anche

Concetti

Esecuzione di query sui dati come oggetti (Entity Framework)