Creare un'app per eseguire query di base

In questo articolo vengono illustrate le operazioni seguenti:

Prerequisiti

Configurare l'ambiente di sviluppo per usare la libreria client Kusto.

Eseguire una query di base ed elaborare i risultati

Nell'IDE o nell'editor di testo preferito creare un progetto o un file denominato query di base usando la convenzione appropriata per il linguaggio preferito. Aggiungere quindi il codice seguente:

  1. Creare un'app client che si connette al cluster della Guida.

    using Kusto.Data;
    using Kusto.Data.Net.Client;
    
    namespace BasicQuery {
      class BasicQuery {
        static void Main(string[] args) {
          var clusterUri = "https://help.kusto.windows.net/";
          var kcsb = new KustoConnectionStringBuilder(clusterUri)
              .WithAadUserPromptAuthentication();
    
          using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
          }
        }
      }
    }
    
  2. Definire il database e la query da eseguire. La query restituisce la data, lo stato e il danno totale relativo al tornado, in cui il danno totale supera i 100 milioni di dollari.

    var database = "Samples";
    var query = @"StormEvents
                  | where EventType == 'Tornado'
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > 100000000
                  | order by DailyDamage desc";
    
  3. Eseguire la query e stampare il risultato.

    using (var response = kustoClient.ExecuteQuery(database, query, null)) {
      int columnNoStartTime = response.GetOrdinal("StartTime");
      int columnNoState = response.GetOrdinal("State");
      int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
      Console.WriteLine("Daily tornado damages over 100,000,000$:");
    
      while (response.Read()) {
        Console.WriteLine("{0} - {1}, {2}",
          response.GetDateTime(columnNoStartTime),
          response.GetString(columnNoState),
          response.GetInt64(columnNoDailyDamage));
      }
    }
    

Il codice completo dovrebbe essere simile al seguente:

using Kusto.Data;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"StormEvents
                         | where EventType == 'Tornado'
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > 100000000
                         | order by DailyDamage desc";

        using (var response = kustoClient.ExecuteQuery(database, query, null)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily tornado damages over 100,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Eseguire l'app

In una shell dei comandi usare il comando seguente per eseguire l'app:

# Change directory to the folder that contains the basic queries project
dotnet run .

Verrà visualizzato un risultato simile al seguente:

Daily damages tornado with damages over 100,000,000$:
2007-02-02 00:00:00+00:00 - FLORIDA , 270004000 $
2007-03-01 00:00:00+00:00 - ALABAMA , 266853000 $
2007-05-04 00:00:00+00:00 - KANSAS , 251625000 $
2007-03-01 00:00:00+00:00 - GEORGIA , 143688000 $

Usare le posizioni ordinali per accedere ai valori delle colonne

Quando l'ordine delle colonne in un risultato di query è noto, è più efficiente accedere ai valori delle colonne in base alla relativa posizione ordinale nel set di risultati rispetto al nome della colonna. Facoltativamente, in fase di esecuzione è possibile usare un metodo di libreria per determinare un ordinale di colonna dal nome della colonna.

Nota

È possibile controllare la presenza e l'ordine delle colonne in un risultato della query usando gli project operatori o project-away .

Ad esempio, è possibile modificare il codice precedente per accedere ai valori delle StartTimecolonne , Statee DailyDamage in base alle rispettive posizioni ordinali nel set di risultati:

In C# è possibile accedere solo ai valori delle colonne in base alle rispettive posizioni ordinali nel set di risultati. Non è possibile usare i nomi delle colonne; di conseguenza, il codice rimane invariato.

int columnNoStartTime = response.GetOrdinal("StartTime");
int columnNoState = response.GetOrdinal("State");
int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
Console.WriteLine("Daily tornado damages over 100,000,000$:");

while (response.Read()) {
  Console.WriteLine("{0} - {1}, {2}",
    response.GetDateTime(columnNoStartTime),
    response.GetString(columnNoState),
    response.GetInt64(columnNoDailyDamage));
}

Personalizzare il comportamento delle query con le proprietà della richiesta client

È possibile personalizzare il comportamento di una query impostando le proprietà della richiesta client. Per altre informazioni sulle opzioni disponibili, vedere Proprietà delle richieste client.

Ad esempio, è possibile sostituire la kusto_client.execute_query chiamata nel codice precedente per passare un ID richiesta personalizzato e impostare il timeout della query su 1 minuto. Per usare le proprietà della richiesta client, è necessario importare la ClientRequestProperties classe .

using Kusto.Data.Common;

var crp = new ClientRequestProperties();
// Set a custom client request identifier
crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
// Set the query timeout to 1 minute
crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
}

Usare i parametri di query per proteggere l'input dell'utente

I parametri di query sono importanti per mantenere la sicurezza e la protezione dei dati. Protegge da potenziali attori malintenzionati che potrebbero tentare di ottenere l'accesso non autorizzato o danneggiare i dati. Per altre informazioni sulle query con parametri, vedere Istruzione di dichiarazione dei parametri di query.

Ad esempio, è possibile modificare il codice precedente per passare il valore EventType e il valore minimo DailyDamage come parametri alla query. Per usare i parametri:

  1. Dichiarare i parametri nel testo della query
  2. Sostituire i valori delle proprietà nel testo della query con i nomi dei parametri
  3. Impostare i valori dei parametri nelle proprietà della richiesta client passate al metodo execute
string query = @"declare query_parameters(event_type:string, daily_damage:int);
                  StormEvents
                  | where EventType == event_type
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > daily_damage
                  | order by DailyDamage desc";

var crp = new ClientRequestProperties();
crp.SetParameter("event_type", "Flash Flood");
crp.SetParameter("daily_damage", 200000000.ToString());

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
  int columnNoStartTime = response.GetOrdinal("StartTime");
  int columnNoState = response.GetOrdinal("State");
  int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
  Console.WriteLine("Daily flash flood damages over 200,000,000$:");

  while (response.Read()) {
    Console.WriteLine("{0} - {1}, {2}",
      response.GetDateTime(columnNoStartTime),
      response.GetString(columnNoState),
      response.GetInt64(columnNoDailyDamage));
  }
}

Il codice completo che usa le posizioni ordinali per accedere ai valori di colonna e ai parametri dovrebbe essere simile al seguente:

using Kusto.Data;
using Kusto.Data.Common;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"declare query_parameters(event_type:string, daily_damage:int);
                         StormEvents
                         | where EventType == event_type
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > daily_damage
                         | order by DailyDamage desc";

        var crp = new ClientRequestProperties();
        crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
        crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");
        crp.SetParameter("event_type", "Flash Flood");
        crp.SetParameter("daily_damage", 200000000.ToString());

        using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily flash flood damages over 200,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Verrà visualizzato un risultato simile al seguente:

Daily flash flood damages over 200,000,000$:
2007-08-21 00:00:00+00:00 - OHIO , 253320000 $

Passaggio successivo