Considerazioni su LINQ (WCF Data Services)

 

Data di pubblicazione: maggio 2016

In questo argomento vengono fornite informazioni sulla modalità con cui le query LINQ vengono composte ed eseguite quando si usa il client WCF Data Services e sulle limitazioni dell'utilizzo di LINQ per eseguire una query su un servizio dati che implementa Protocollo OData (Open Data). Per altre informazioni sucreazione e l'esecuzione di query su un OData-basato su servizio dati, vedere query sul servizio dati.

LINQ consente di comporre query per una raccolta di oggetti che implementa IEnumerable<>>. Entrambi i Aggiungi riferimento al servizio nella finestra di dialogo Visual Studio e lo strumento DataSvcUtil.exe vengono utilizzati per generare la rappresentazione di un OData servizio come classe contenitore di entità che eredita da DataServiceContext, nonché gli oggetti che rappresentano le entità restituite nei feed. Questi strumenti generano anche le proprietà per la classe contenitore di entità delle raccolte esposte come feed dal servizio. Ognuna di queste proprietà della classe che incapsula il servizio dati restituisce un DataServiceQuery<>>. Poiché il DataServiceQuery<> </> > implementa il IQueryable<> </> > interfaccia definita da LINQ, è possibile comporre una query LINQ per i feed esposti dal servizio dati che vengono convertiti dalla libreria client in una richiesta di query URI che viene inviato al servizio dati in esecuzione.

System_CAPS_ICON_important.jpg Importante

La sintassi LINQ consente di esprimere un set di query più ampio di quello consentito dalla sintassi URI usata dai servizi dati OData. Oggetto NotSupportedException viene generato quando la query non può essere mappata a un URI nel servizio dati di destinazione. Per altre informazioni, vedereil metodi LINQ non supportati in questo argomento.

Nell'esempio seguente viene riportata una query LINQ che restituisce Orders con un costo di spedizione maggiore di&30; dollari e ordina i risultati in base alla data di spedizione, partendo da quella più recente:

[Astoria NorthwindClient #AddQueryOptionsLinqSpecific](Astoria NorthwindClient#AddQueryOptionsLinqSpecific)]

Questa query LINQ viene convertita nella query seguente URI che viene eseguita su basato su Northwind Guida introduttiva servizio dati:

http://localhost:12345/Northwind.svc/Orders?Orderby=ShippedDate&?filter=Freight gt 30  

Per ulteriori informazioni generali su LINQ, vedere LINQ (Language-Integrated Query).

LINQ consente di comporre query tramite la sintassi di query dichiarativa specifica della lingua, mostrata nell'esempio precedente, e un set di metodi di query noti come operatori di query standard. Una query equivalente a quella dell'esempio precedente può essere composta solo tramite la sintassi basata sul metodo, come indicato nell'esempio seguente:

[Astoria NorthwindClient #AddQueryOptionsLinqExpressionSpecific](Astoria NorthwindClient#AddQueryOptionsLinqExpressionSpecific)]

Il client WCF Data Services è in grado di convertire entrambi tipi di query composte in un URI di query ed è possibile estendere una query LINQ aggiungendo i metodi di query a un'espressione di query. Quando si compongono query LINQ aggiungendo la sintassi del metodo a un'espressione di query o un DataServiceQuery<>>, le operazioni vengono aggiunte all'URI della query nell'ordine in cui vengono chiamati. Questo è equivalente alla chiamata di AddQueryOption per aggiungere ogni opzione di query all'URI della query.

LINQ determinati metodi di query, ad esempio prima<>>(IEnumerable<>>) o singolo<>>(IEnumerable<>>), quando aggiunto alla query, la query da eseguire. Una query viene eseguita anche quando i risultati vengono enumerati in modo implicito, ad esempio durante un ciclo foreach o quando la query è assegnata a una raccolta List. Per ulteriori informazioni, vedere query sul servizio dati.

Il client esegue una query LINQ in due parti. Ogni qualvolta possibile, le espressioni LINQ di una query vengono prima valutate sul client e quindi viene generata una query basata sull'URI che viene inviata al servizio dati per la valutazione rispetto ai dati del servizio. Per ulteriori informazioni, vedere la sezione Server esecuzione del Client e in query sul servizio dati.

Quando non è possibile convertire una query LINQ in un URI di query conforme a OData, viene generata un'eccezione quando viene tentata l'esecuzione. Per ulteriori informazioni, vedere query sul servizio dati.

Negli esempi delle sezioni seguenti vengono illustrati i tipi di query LINQ che possono essere eseguiti su un servizio OData.

Filtro

Negli esempi di query LINQ in questa sezione vengono filtrati i dati nel feed restituito dal servizio.

Negli esempi seguenti vengono illustrate query equivalenti che filtrano le entità Orders restituite in modo che vengano restituiti solo gli ordini con un costo di spedizione maggiore di $30:

  • Utilizzo della sintassi di query LINQ:

    [Astoria NorthwindClient #LinqWhereClauseSpecific](Astoria NorthwindClient#LinqWhereClauseSpecific)]

  • Utilizzo dei metodi di query LINQ:

    [Astoria NorthwindClient #LinqWhereMethodSpecific](Astoria NorthwindClient#LinqWhereMethodSpecific)]

  • Opzione $filter della stringa di query:

    [Astoria NorthwindClient #ExplicitQueryWhereMethodSpecific](Astoria NorthwindClient#ExplicitQueryWhereMethodSpecific)]

Tutti gli esempi precedenti vengono convertiti nell'URI di query: http://localhost:12345/northwind.svc/Orders()?$filter=Freight gt 30M.

Ordinamento

Negli esempi seguenti vengono illustrate query equivalenti che ordinano i dati restituiti in base al nome dell'azienda e al codice postale, in ordine decrescente:

  • Utilizzo della sintassi di query LINQ:

    [Astoria NorthwindClient #LinqOrderByClauseSpecific](Astoria NorthwindClient#LinqOrderByClauseSpecific)]

  • Utilizzo dei metodi di query LINQ:

    [Astoria NorthwindClient #LinqOrderByMethodSpecific](Astoria NorthwindClient#LinqOrderByMethodSpecific)]

  • Opzione $orderby della stringa di query:

    [Astoria NorthwindClient #ExplicitQueryOrderByMethodSpecific](Astoria NorthwindClient#ExplicitQueryOrderByMethodSpecific)]

Tutti gli esempi precedenti vengono convertiti nell'URI di query: http://localhost:12345/northwind.svc/Customers()?$orderby=CompanyName,PostalCode desc.

Proiezione

Negli esempi seguenti vengono illustrate query equivalenti che ordinano i dati restituiti dal progetto nel tipo CustomerAddress più ristretto:

  • Utilizzo della sintassi di query LINQ:

    [Astoria NorthwindClient #LinqSelectClauseSpecific](Astoria NorthwindClient#LinqSelectClauseSpecific)]

  • Utilizzo dei metodi di query LINQ:

    [Astoria NorthwindClient #LinqSelectMethodSpecific](Astoria NorthwindClient#LinqSelectMethodSpecific)]

System_CAPS_ICON_note.jpg Nota

Il $select opzione query non può essere aggiunta a un URI di query tramite il AddQueryOption metodo. Si consiglia di utilizzare LINQ selezionare<TSource, TResult> metodo per generare il client di $select opzione nell'URI della richiesta di query.</TSource, TResult>

Entrambi gli esempi precedenti vengono convertiti nell'URI di query: "http://localhost:12345/northwind.svc/Customers()?$filter=Country eq 'GerGerm'&$select=CustomerID,Address,City,Region,PostalCode,Country".

Paging del client

Negli esempi seguenti vengono illustrate query equivalenti che richiedono una pagina delle entità ordinate che include 25 ordini, ignorando i primi 50 ordini:

  • Applicazione di metodi di query a una query LINQ:

    [Astoria NorthwindClient #LinqSkipTakeMethodSpecific](Astoria NorthwindClient#LinqSkipTakeMethodSpecific)]

  • Opzioni $skip e $top della stringa di query dell'URI:

    [Astoria NorthwindClient #ExplicitQuerySkipTakeMethodSpecific](Astoria NorthwindClient#ExplicitQuerySkipTakeMethodSpecific)]

Entrambi gli esempi precedenti vengono convertiti nell'URI di query: http://localhost:12345/northwind.svc/Orders()?$orderby=OrderDate desc&$skip=50&$top=25.

Espandi

Quando si esegue una query su un servizio dati OData, è possibile richiedere che le entità relative all'entità di destinazione della query siano incluse nel feed restituito. Il Espandi metodo viene chiamato sul DataServiceQuery<> </> > per il set di entità indirizzato dalla query LINQ, con l'entità correlata impostare nome fornito come il path parametro. Per ulteriori informazioni, vedere il caricamento di contenuto posticipato.

Gli esempi seguenti illustrano modi equivalenti per usare il Espandi metodo in una query:

  • Nella sintassi della query LINQ:

    [Astoria NorthwindClient #LinqQueryExpandSpecific](Astoria NorthwindClient#LinqQueryExpandSpecific)]

  • Con i metodi di query LINQ:

    [Astoria NorthwindClient #LinqQueryExpandMethodSpecific](Astoria NorthwindClient#LinqQueryExpandMethodSpecific)]

Entrambi gli esempi precedenti vengono convertiti nell'URI di query: http://localhost:12345/northwind.svc/Orders()?$filter=CustomerID eq 'ALFKI'&$expand=Order_Details.

Nella tabella seguente sono riportate le classi dei metodi LINQ non supportati che non possono essere incluse in una query eseguita su un servizio OData:

Tipo di operazioneMetodo non supportato
Operatori SetTutti gli operatori set non sono supportati con un DataServiceQuery<>>, che include quanto segue:

- Tutti<>>
- Qualsiasi<>>
- Concat<>>
- DefaultIfEmpty<>>
- DISTINCT<>>
- La differenza<>>
- Intersect<>>
- Unione<>>
- ZIP<TFirst, TSecond, TResult></TFirst, TSecond, TResult>
Operatori di ordinamentoGli operatori di ordinamento seguenti che richiedono IComparer<> </> > non sono supportati con un DataServiceQuery<>>:

- OrderBy<TSource, TKey>(IEnumerable<>>, Func<TSource, TKey>, IComparer<>>) </TSource, TKey> </TSource, TKey>
- OrderByDescending<TSource, TKey>(IEnumerable<>>, Func<TSource, TKey>, IComparer<>>) </TSource, TKey> </TSource, TKey>
- ThenBy<TSource, TKey>(IOrderedEnumerable<>>, Func<TSource, TKey>, IComparer<>>) </TSource, TKey> </TSource, TKey>
- ThenByDescending<TSource, TKey>(IOrderedEnumerable<>>, Func<TSource, TKey>, IComparer<>>) </TSource, TKey> </TSource, TKey>
Operatori di proiezione e di filtroI seguenti operatori di proiezione e filtro che accettano un argomento posizionale non sono supportati con un DataServiceQuery<>>:

- Creare un join<TOuter, TInner, TKey, TResult>(IEnumerable<>>, IEnumerable<>>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>, IEqualityComparer<>>) </TOuter, TInner, TResult> </TInner, TKey> </TOuter, TKey> </TOuter, TInner, TKey, TResult>
- Selezionare<TSource, TResult>(IEnumerable<>>, Func<TSource, Int32, TResult>) </TSource, Int32, TResult> </TSource, TResult>
- SelectMany<TSource, TResult>(IEnumerable<>>, Func<><>>>) </TSource, TResult>
- SelectMany<TSource, TResult>(IEnumerable<>>, Func<><>>>) </TSource, TResult>
- SelectMany<TSource, TCollection, TResult>(IEnumerable<>>, Func<><>>>, Func<TSource, TCollection, TResult>) </TSource, TCollection, TResult> </TSource, TCollection, TResult>
- SelectMany<TSource, TCollection, TResult>(IEnumerable<>>, Func<><>>>, Func<TSource, TCollection, TResult>) </TSource, TCollection, TResult> </TSource, TCollection, TResult>
- Dove<>>(IEnumerable<>>, Func<TSource, Int32, Boolean>) </TSource, Int32, Boolean>
Operatori di raggruppamentoTutti gli operatori di raggruppamento non sono supportati con un DataServiceQuery<>>, inclusi i seguenti:

- GroupBy<TSource, TKey></TSource, TKey>
- GroupJoin<TOuter, TInner, TKey, TResult></TOuter, TInner, TKey, TResult>

È necessario eseguire le operazioni di raggruppamento sul client.
Operatori di aggregazioneTutte le operazioni di aggregazione non sono supportate con un DataServiceQuery<>>, inclusi i seguenti:

- Funzione di aggregazione<>>
- Media
- Conteggio<>>
- LongCount<>>
- Max
- Min
- Somma

Le operazioni di aggregazione devono essere eseguite sul client o devono essere incapsulate da un'operazione del servizio.
Operatori di pagingGli operatori di paging seguenti non sono supportati con un DataServiceQuery<>>:

- ElementAt<>>
- Ultimo<>>
- LastOrDefault<>>
- SkipWhile<>>
- TakeWhile<> </> >  Nota: operatori di spostamento che vengono eseguiti in una sequenza vuota restituiscono null.
Altri operatoriLe operazioni seguenti non sono supportati altri operatori con un DataServiceQuery<>>:

1. Vuoto<>>
2. Intervallo
3. Ripetere<>>
4. ToDictionary<TSource, TKey></TSource, TKey>
5. ToLookup<TSource, TKey></TSource, TKey>

Le proprietà e i metodi Common Language Runtime (CLR) riportati di seguito sono supportati perché possono essere convertiti in un'espressione di query per l'inclusione nell'URI della richiesta a un servizio OData:

Stringa membroFunzione OData supportata
Concat (String, String)string concat(string p0, string p1)
Contains(String)bool substringof(string p0, string p1)
EndsWith(String)bool endswith(string p0, string p1)
IndexOf (String, Int32)int indexof(string p0, string p1)
Lunghezzaint length(string p0)
Replace (String, String)string replace(string p0, string find, string replace)
Substring(Int32)string substring(string p0, int pos)
Substring (Int32, Int32)string substring(string p0, int pos, int length)
ToLower)string tolower(string p0)
ToUpper)string toupper(string p0)
Trim)string trim(string p0)
DateTime membro1Funzione OData supportata
Giornoint day(DateTime p0)
Oraint hour(DateTime p0)
Minutoint minute(DateTime p0)
Meseint month(DateTime p0)
Secondoint second(DateTime p0)
Annoint year(DateTime p0)

1l'equivalente proprietà data e ora di Microsoft.VisualBasic.DateAndTime, così come il DatePart metodo in Visual Basic sono inoltre supportati.

Matematiche membroFunzione OData supportata
Ceiling(Decimal)decimal ceiling(decimal p0)
Ceiling(Double)double ceiling(double p0)
Floor(Decimal)decimal floor(decimal p0)
Floor(Double)double floor(double p0)
Round(Decimal)decimal round(decimal p0)
Round(Double)double round(double p0)
[T: System.Linq.Expressions.Expression](assetId:///T: System.Linq.Expressions.Expression?qualifyHint=False&autoUpgrade=True) membroFunzione OData supportata
TypeIs (espressione, tipo)bool isof(type p0)

È possibile che il client sia anche in grado di valutare funzioni CLR aggiuntive sul client. Oggetto NotSupportedException viene generato per qualsiasi espressione che non può essere valutata sul client e non può essere convertito in un URI di richiesta valido per la valutazione sul server.

Query sul servizio dati
Proiezioni di query
Materializzazione degli oggetti
OData: Convenzioni URI

Mostra: