Condividi tramite


Proiezioni di query (WCF Data Services)

In OData (Open Data Protocol) la proiezione fornisce un meccanismo per ridurre la quantità di dati nel feed restituiti da una query specificando che solo determinate proprietà di un'entità vengano restituite nella risposta. Per ulteriori informazioni, vedere la pagina relativa all'opzione query di sistema Select ($select) in OData.

In questo argomento viene descritto come definire una proiezione di query e quali sono i requisiti per i tipi di entità e non entità. Viene inoltre illustrato come eseguire gli aggiornamenti dei risultati proiettati e creare i tipi proiettati e vengono elencate alcune considerazioni sulla proiezione.

Definizione di una proiezione di query

È possibile aggiungere una clausola di proiezione a una query utilizzando l'opzione query $select in un URI o la clausola select (Select in Visual Basic) in una query LINQ. I dati di entità restituiti possono essere proiettati in tipi di entità o non entità sul client. Negli esempi di questo argomento viene illustrato l'utilizzo della clausola select in una query LINQ.

Importante

Quando si salvano gli aggiornamenti apportati ai tipi proiettati, potrebbe verificarsi una perdita di dati nel servizio dati.Per ulteriori informazioni, vedere Considerazioni sulla proiezione.

Requisiti per tipi di entità e non entità

I tipi di entità devono disporre di una o più proprietà Identity che costituiscono la chiave di entità. I tipi di entità vengono definiti nei client utilizzando uno dei modi riportati di seguito.

Per impostazione predefinita, quando si proiettano i risultati delle query in un tipo definito nel client, le proprietà richieste nella proiezione devono esistere nel tipo di client. Tuttavia, quando si specifica un valore true per la proprietà IgnoreMissingProperties di DataServiceContext, non è necessario che le proprietà specificate nella proiezione siano presenti nel tipo di client.

Aggiornamenti dei risultati proiettati

Quando si proiettano i risultati di una query in tipi di entità nel client, DataServiceContext può rilevare gli oggetti con aggiornamenti da restituire al servizio dati quando viene chiamato il metodo SaveChanges. Tuttavia, gli aggiornamenti apportati ai dati proiettati in tipi di non entità nel client non possono essere restituiti al servizio dati, perché il servizio dati non può aggiornare l'entità corretta nell'origine dati senza una chiave per identificare l'istanza di entità. I tipi di non entità non vengono associati a DataServiceContext.

Quando una o più proprietà di un tipo di entità definito nel servizio dati non sono presenti nel tipo di client in cui viene proiettata l'entità, gli inserimenti di nuove entità non conterranno le proprietà mancanti. In questo caso, anche gli aggiornamenti apportati alle entità esistenti non includeranno le proprietà mancanti. Quando esiste un valore per la proprietà, l'aggiornamento ripristina il valore predefinito della proprietà, secondo quanto definito nell'origine dati.

Creazione di tipi proiettati

Nell'esempio seguente viene utilizzata una query LINQ anonima che proietta le proprietà correlate all'indirizzo del tipo Customers in un nuovo tipo CustomerAddress, definito nel client ed attribuito come tipo di entità:

' Define an anonymous LINQ query that projects the Customers type into 
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress With { _
                    .CustomerID = c.CustomerID, _
                    .Address = c.Address, _
                    .City = c.City, _
                    .Region = c.Region, _
                    .PostalCode = c.PostalCode, _
                    .Country = c.Country}
// Define an anonymous LINQ query that projects the Customers type into 
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress { 
                CustomerID = c.CustomerID, 
                Address = c.Address, 
                City = c.City, 
                Region = c.Region,
                PostalCode = c.PostalCode, 
                Country = c.Country};

In questo esempio, il modello dell'inizializzatore di oggetti viene utilizzato per creare una nuova istanza del tipo CustmerAddress, anziché chiamare un costruttore. I costruttori non sono supportati in caso di proiezione in tipi di entità, ma possono essere utilizzati durante la proiezione in tipi di non entità e anonimi. Poiché CustomerAddress è un tipo di entità, le modifiche possono essere apportate e restituite al servizio dati.

Inoltre, i dati del tipo Customer vengono proiettati in un'istanza del tipo di entità CustomerAddress, anziché di un tipo anonimo. La proiezione in tipi anonimi è supportata, ma i dati sono di sola lettura perché i tipi anonimi vengono considerati come tipi di non entità.

Le impostazioni MergeOption di DataServiceContext vengono utilizzate per la risoluzione di identità durante la proiezione di query. Pertanto, se un'istanza del tipo Customer esiste già in DataServiceContext, un'istanza di CustomerAddress con la stessa identità seguirà le regole di risoluzione di identità specificate da MergeOption

Nella tabella seguente vengono descritti i comportamenti durante la proiezione dei risultati di tipi di entità e non entità:

Azione

Tipo di entità

Tipo di non entità

Creazione di una nuova istanza proiettata tramite inizializzatori, come nell'esempio seguente:

Supportato

Supportato

Creazione di una nuova istanza proiettata tramite costruttori, come nell'esempio seguente:

Viene generato un oggetto NotSupportedException.

Supportato

Utilizzo di una proiezione per trasformare un valore di proprietà, come nell'esempio seguente:

Questa trasformazione non è supportata per i tipi di entità perché può generare confusione e la potenziale sovrascrittura dei dati nell'origine dati appartenenti a un'altra entità.

Viene generato un oggetto NotSupportedException.

Supportato

Considerazioni sulla proiezione

Alla definizione di una proiezione di query si applicano le considerazioni aggiuntive seguenti:

  • Quando si definiscono feed personalizzati per il formato Atom, è necessario assicurarsi che tutte le proprietà dell'entità che dispongono di definizioni di mapping personalizzate vengano incluse nella proiezione. Se una proprietà di entità sottoposta a mapping non è inclusa nella proiezione, potrebbe verificarsi una perdita di dati. Per ulteriori informazioni, vedere Personalizzazione di feed (WCF Data Services).

  • Quando vengono apportati inserimenti a un tipo proiettato che non contiene tutte le proprietà dell'entità nel modello di dati del servizio dati, le proprietà non incluse nella proiezione vengono impostate sui valori predefiniti nel client.

  • Quando vengono apportati aggiornamenti a un tipo proiettato che non contiene tutte le proprietà dell'entità nel modello di dati del servizio dati, i valori esistenti non inclusi nella proiezione vengono sovrascritti con i valori predefiniti non inizializzati nel client.

  • Quando una proiezione include una proprietà complessa, è necessario che venga restituito l'intero oggetto complesso.

  • Quando una proiezione include una proprietà di navigazione, gli oggetti correlati vengono caricati in modo implicito senza necessità di chiamare il metodo Expand. Il metodo Expand non è supportato in una query proiettata.

  • Le proiezioni di query eseguite nel client vengono convertite per l'utilizzo dell'opzione query $select nell'URI della richiesta. Se una query con proiezione viene eseguita su una versione precedente di WCF Data Services che non supporta l'opzione query $select, viene restituito un errore. Questa situazione può inoltre verificarsi quando MaxProtocolVersion di DataServiceBehavior per il servizio dati viene impostato sul valore V1. Per ulteriori informazioni, vedere Controllo delle versioni del servizio dati (WCF Data Services).

Per ulteriori informazioni, vedere Procedura: proiettare i risultati delle query (WCF Data Services).

Vedere anche

Concetti

Esecuzione di query sul servizio dati (WCF Data Services)