Creare un'applicazione di query flessibile

Aggiornamento: febbraio 2014

 

Logo DataMarket

Usare i riferimenti al servizio in Visual Studio per utilizzare a livello di codice i set di dati del Marketplace specificati dal server di pubblicazione dei dati come set di dati di query flessibili.

ImportantImportante
Il codice in un riferimento al servizio non deve essere modificato, poiché una modifica potrebbe provocare un funzionamento non corretto ed effetti collaterali. Le modifiche, inoltre, verranno sovrascritte ogni volta che si aggiorna il riferimento al servizio.

Prima di continuare, è necessario che siano disponibili gli elementi seguenti:

  • Account Windows Live ID valido. Se non si ha un Live ID, passare alla home page di Windows Live ed effettuare l'iscrizione.

  • Un account di Marketplace valido. Se non si ha un account del Marketplace, passare all'argomento Creazione di un account Marketplace personale e seguire le istruzioni visualizzate.

  • Una sottoscrizione al set di dati di query flessibile del Marketplace da usare nell'applicazione. Se non si ha una sottoscrizione a un set di dati di query flessibile, passare a Sottoscrivere un'offerta di dati e seguire le istruzioni visualizzate.

 

Sezione Descrizione

Passaggio 1: Creare il progetto in Visual Studio

Passaggi da eseguire in Visual Studio per avviare un nuovo progetto console per il Marketplace.

Passaggio 2: Aggiungere il riferimento al servizio per il servizio dati

Passaggi da eseguire per aggiungere un riferimento al servizio per l'utilizzo dei dati del Marketplace.

Passaggio 3: Utilizzare i dati con codice gestito

Codice scritto per l'utilizzo di un set di dati di query flessibile del Marketplace.

Codice completo

Applicazione console completa in C# e VB.

Metadati

Metadati XML di esempio per questo set di dati di query flessibile.

  1. Scegliere Visual Studio dal menu Start.

  2. Fare clic con il pulsante destro del mouse su Visual Studio.

  3. Scegliere Esegui come amministratore dal menu a discesa.

  4. Quando viene richiesto se si vuole permettere al programma (devenv.exe) di apportare modifiche nel computer, fare clic su .

  1. Nella pagina iniziale di Visual Studio selezionare Nuovo progetto.

  2. Selezionare Visual C# e Applicazione console (Visual Basic e Applicazione console se si preferisce Visual Basic) nella finestra di dialogo Nuovo progetto.

  3. Nella parte superiore della finestra di dialogo Nuovo progetto selezionare .NET Framework 4 dall'elenco a discesa a sinistra.

    In Visual Studio 2010 viene usata l'impostazione predefinita .NET Framework 4. Se si usa una versione precedente di Visual Studio e .NET Framework 4 non è installato, passare alla pagina di download di .NET Framework 4 per scaricarlo e installarlo.

  4. Assegnare al progetto un nome significativo. Ad esempio, è possibile specificare il nome USCrime2006and2007 per questo progetto.

  5. Fare clic su OK.

  6. Aggiungere il codice seguente nella parte iniziale del file Program.cs (Program.vb), necessario per l'autenticazione dell'accesso al set di dati.

    using System.Net; // needed for authentication
    

Dopo avere avviato Visual Studio come amministratore e dopo avere creato una nuova applicazione console (passaggio 1), aggiungere il riferimento al servizio per il servizio dati da utilizzare.

  1. Passare alla Marketplace home page.

  2. Fare clic sulla scheda Dati personali.

  3. Individuare il servizio dati 2006 - 2008 Crime in the United States.

  4. Fare clic su Usa a destra del nome del set di dati. Verrò visualizzata la pagina Dettagli per questo set di dati.

  5. Scorrere la pagina fino a visualizzare le schede sotto le informazioni su come usare i dati in Visual Studio

  6. Fare clic sulla scheda Dettagli.

  7. Individuare l'URL della radice del servizio.

    URL della radice del servizio


    Figura 1 – URL radice del servizio

  8. Copiare l'URL della radice del servizio negli Appunti.

  1. Tornare al progetto di Visual Studio.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti.

  3. Scegliere Aggiungi riferimento al servizio dal menu a discesa.

  4. Incollare l'URL radice del servizio dagli Appunti all'elenco a discesa Indirizzo.

  5. Fare clic su Vai.
    Attendere alcuni istanti. La casella di testo Servizi verrà popolata con il servizio disponibile per il progetto.

  6. Immettere un nome significativo per lo spazio dei nomi nella casella di testo Spazio dei nomi.
    Ad esempio: DataGovCrimes.

  7. Fare clic su OK.
    Il nome del riferimento al servizio verrà visualizzato in Riferimenti servizio in Esplora soluzioni.

  1. Selezionare Program.cs (Program.vb) nel riquadro del codice di Visual Studio.

  2. Aggiungere l'istruzione seguente, che rende disponibile il riferimento al servizio per l'applicazione.

    noteNota
    Usare lo spazio dei nomi del programma e il nome dello spazio dei nomi del riferimento al servizio creati nel passaggio 6 precedente.

    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    

  1. Creare una classe pubblica CrimeData nello spazio dei nomi del progetto.

  2. Creare due variabili private nella classe.

    • Specificare un URI per il servizio.

    • Specificare un contenitore del servizio che archivia le credenziali del servizio nel contesto del servizio.

      1. Passare alla pagina "Dettagli".

      2. Fare clic sull'opzione relativa all'introduzione al set di dati.

      3. Fare clic sulla scheda Panoramica.
        Verranno visualizzati il nome del set di entità e il nome della raccolta di entità.

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    }  // end class CrimeData
    
    
  3. Creare un costruttore per la classe CrimeData.
    Il costruttore inizializza entrambe le variabili private e inizializza le credenziali utente.
    SERVICE_ROOT_URL corrisponde al collegamento https copiato in precedenza negli Appunti. Vedere Ottenere l'URL radice del servizio.
    context corrisponde al contenitore del servizio usato per le credenziali utente.
    La proprietà IgnoreMissingProperties è impostata su true per rendere il client affidabile rispetto alle proprietà aggiunte al tipo sul server. Per altre informazioni, vedere la documentazione su MSDN .
    USER_ID corrisponde al Live ID.
    SECURE_ACCOUNT_KEY è la chiave dell'account del Marketplace usato per questa applicazione. Vedere Gestire l'account del Marketplace.

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()  
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID); // Your Marketplace account key
        }  // end constructor
    
    }  // end class CrimeData
    
    
  4. Creare un metodo pubblico nella classe che restituisce un elenco generico. Per questo programma il tipo di elenco generico è CityCrime.
    Questo metodo esegue query nel servizio e, in caso di esito positivo, restituisce il set di risultati sotto forma di elenco. Se la query ha esito negativo per qualsiasi motivo, il metodo restituisce un valore null (Nothing).

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID);
        }  // end constructor
    
        // -- public method that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try
    
        }  // end function GetCrimeData
    
    }  // end class CrimeData
    
    

    La query può essere qualsiasi query LINQ valida del Marketplace e può includere facoltativamente il filtro where (Where) e/o orderby (Order By).
    Per altre informazioni sulle query LINQ, vedere Espressioni di query LINQ (Guida per programmatori C#) (LINQ in Visual Basic).
    Per informazioni sulle limitazioni delle query LINQ nel Marketplace, vedere Opzioni di query OData supportate.

    Le query LINQ seguenti sono valide nel Marketplace.

    
    query = from crimes in context.CityCrime
                where crimes.City == "Newport" 
                orderby crimes.Year Ascending
                select crimes;
    //  this query could also be written as
    //  IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
    
  5. Scrivere il codice in Main() che usa la classe CrimeData e il metodo GetCrimeData() per utilizzare i dati e visualizzarli.

    
    using System.Net;
    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    
    namespace USCrime2006and2007
    {
       class Program
       {
          public static void Main(string[] args)
          {
              IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
              CrimeData crimeData = new CrimeData();
    
              crimeList = crimeData.GetCrimeData();
    
              if (crimeList != null)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                          "City",
                                                                          "State",
                                                                          "Population",
                                                                          "Violent Crime");
    
                  foreach (CityCrime c in crimeList)
                  {
                      Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                               c.City, 
                                                                               c.State, 
                                                                               c.Population,
                                                                               c.ViolentCrime);
                  } // end foreach
    
              }  // end if
    
              Console.Write("Tap any key to exit. ");
              Console.ReadKey();
    
          }  // end Main
    
        }  // end class Program
    
    }  // end namespace
    
    


using System.Net;
using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName

namespace USCrime2006and2007
{
   class Program
   {
      public static void Main(string[] args)
      {
          IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
          CrimeData crimeData = new CrimeData();

          crimeList = crimeData.GetCrimeData();

          if (crimeList != null)
          {
              Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                      "City",
                                                                      "State",
                                                                      "Population",
                                                                      "Violent Crime");

              foreach (CityCrime c in crimeList)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                           c.City, 
                                                                           c.State, 
                                                                           c.Population,
                                                                           c.ViolentCrime);
              } // end foreach

          }  // end if

          Console.Write("Tap any key to exit. ");
          Console.ReadKey();

      }  // end Main

    }  // end class Program

    class CrimeData
    {
        private Uri serviceUri;
        private datagovCrimesContainer context;

        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceUri = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceUri);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential USER_ID,
                                                        SECURE_ACCOUNT_KEY); // Your Marketplace account key
        }  // end constructor
 
        // – public function that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
 
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try

        }  // end function

    }  // end class CrimeData

}  // end namespace

I metadati del set di dati forniscono informazioni a IntelliSense durante la scrittura del codice. Se l'IDE non supporta IntelliSense o se IntelliSense non funziona, sarà possibile ottenere i metadati dal servizio.

  1. Ottenere l'URL radice del servizio del set di dati.
    Per istruzioni su come ottenere l'URL radice del servizio, vedere la sezione Ottenere l'URL radice del servizio precedente.

  2. Aggiungere /$metadata alla fine dell'URL radice del servizio.
    Ad esempio, se l'URL radice del servizio è https://api.datamarket.azure.com/Data.ashx/fabrikam.com/inventory, l'URL dei metadati sarà https://api. datamarket.azure.com/Data.ashx/fabrikam.com/inventory/$metadata.

  3. Nel browser passare all'URL dei metadati.

  4. Analizzare i metadati.
    I metadati seguenti sono relativi al set di dati 2006 - 2008 Crime in the United States (https://api.datamarket.azure.com/Data.ashx/data.gov/Crimes/$metadata).

    
    <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:dr="http://schemas.microsoft.com/dallas/2010/04">   
       <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">      
          <Schema Namespace="data.gov.Crimes"xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
                  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
                  xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
             <EntityType Name="CityCrime">
                <Key>
                   <PropertyRef Name="ROWID" />
                </Key>
                <Property Name="ROWID" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="State" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="City" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Year" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Population" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ViolentCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MurderAndNonEgligentManslaughter" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ForcibleRape" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Robbery" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="AggravatedAssault" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="PropertyCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Burglary" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="LarcenyTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MotorVehicleTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Arson" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
             </EntityType>
             <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
                <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
             </EntityContainer>
          </Schema>
       </edmx:DataServices>
    </edmx:Edmx>
    
    

    Esempio di codice 1 – XML dei metadati

    È possibile ottenere molte informazioni utili dallo schema.

    • Nome del contenitore di entità.
      <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
      Corrisponde al tipo di identificatore context privato usato per l'autenticazione dell'accesso al servizio.


    • Nome e tipo del set di entità.
      <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
      Corrisponde al tipo di IEnumerable<T> e IList<T>.


    • Entità e tipo.
      <EntityType Name="CityCrime">
      Corrisponde al tipo usato nella query e nella variabile di ciclo foreach (For Each).


    • Nome di ogni campo restituito da una query.
      Name=”State”


    • Tipo di dati di ogni campo.
      Type=”Edm.String”


    • Validità o meno del valore Null per un campo.
      Nullable=”false”


    • Possibilità o meno di usare un campo per filtrare i risultati della query.
      dr:Queryable=”true”
      dr:Queryable="false"
      Un campo queryable può essere usato in una clausola where (Where) della query. I campi non queryable non possono essere usati in una clausola where (Where) della query.


    • Restituzione o meno di questo campo quando si esegue una query nel set di dati.
      dr:Returned=”true”

Mostra: