Share via


Erstellen einer App zum Ausführen grundlegender Abfragen

In diesem Artikel werden folgende Vorgehensweisen behandelt:

Voraussetzungen

Richten Sie Ihre Entwicklungsumgebung für die Verwendung der Kusto-Clientbibliothek ein.

Ausführen einer einfachen Abfrage und Verarbeiten der Ergebnisse

Erstellen Sie in Ihrer bevorzugten IDE oder dem Text-Editor ein Projekt oder eine Datei namens basic query mithilfe der Konvention, die für Ihre bevorzugte Sprache geeignet ist. Fügen Sie dann den folgenden Code hinzu:

  1. Erstellen Sie eine Client-App, die eine Verbindung mit dem Hilfecluster herstellt.

    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. Definieren Sie die auszuführende Datenbank und Abfrage. Die Abfrage gibt das Datum, den Zustand und den gesamten Tornadoschaden zurück, bei dem der Gesamtschaden 100 Millionen Dollar überschritten hat.

    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. Führen Sie die Abfrage aus, und drucken Sie das Ergebnis.

    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));
      }
    }
    

Der vollständige Code sollte wie folgt aussehen:

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));
          }
        }
      }
    }
  }
}

Ausführen der App

Verwenden Sie in einer Befehlsshell den folgenden Befehl, um Ihre App auszuführen:

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

Es sollte ein Ergebnis ähnlich dem folgenden angezeigt werden:

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 $

Verwenden von Ordnungspositionen für den Zugriff auf Spaltenwerte

Wenn die Reihenfolge der Spalten in einem Abfrageergebnis bekannt ist, ist es effizienter, auf die Werte der Spalten nach ihrer Ordnungsposition im Resultset als nach ihrem Spaltennamen zuzugreifen. Optional können Sie zur Laufzeit eine Bibliotheksmethode verwenden, um eine Spalten ordnungszahl anhand des Spaltennamens zu bestimmen.

Hinweis

Sie können das Vorhandensein und die Reihenfolge von Spalten in einem Abfrageergebnis mithilfe der project Operatoren oder project-away steuern.

Sie können z. B. den vorherigen Code ändern, um auf die Werte der StartTimeSpalten , Stateund DailyDamage deren Ordnungspositionen im Resultset zuzugreifen:

In C# können Sie nur anhand ihrer Ordnungspositionen im Resultset auf die Werte der Spalten zugreifen. Sie können die Spaltennamen nicht verwenden. daher bleibt der Code gleich.

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));
}

Anpassen des Abfrageverhaltens mit Clientanforderungseigenschaften

Sie können das Verhalten einer Abfrage anpassen, indem Sie Clientanforderungseigenschaften festlegen. Weitere Informationen zu den verfügbaren Optionen finden Sie unter Clientanforderungseigenschaften.

Beispielsweise können Sie den kusto_client.execute_query Aufruf im vorherigen Code ersetzen, um eine benutzerdefinierte Anforderungs-ID zu übergeben und das Abfragetimeout auf 1 Minute festzulegen. Um die Clientanforderungseigenschaften zu verwenden, müssen Sie die ClientRequestProperties -Klasse importieren.

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)) {
}

Verwenden von Abfrageparametern zum Schutz von Benutzereingaben

Abfrageparameter sind wichtig, um die Sicherheit und den Schutz Ihrer Daten zu gewährleisten. Es schützt sie vor potenziellen böswilligen Akteuren, die versuchen, sich unbefugten Zugriff auf Ihre Daten zu verschaffen oder diese zu beschädigen. Weitere Informationen zu parametrisierten Abfragen finden Sie unter Abfrageparameterdeklarationsanweisung.

Beispielsweise können Sie den vorherigen Code so ändern, dass der EventType-Wert und der DailyDamage-Mindestwert als Parameter an die Abfrage übergeben werden. So verwenden Sie Parameter:

  1. Deklarieren der Parameter im Abfragetext
  2. Ersetzen Sie die Eigenschaftswerte im Abfragetext durch die Parameternamen.
  3. Festlegen der Parameterwerte in den Clientanforderungseigenschaften, die an die execute-Methode übergeben werden
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));
  }
}

Der vollständige Code, der Ordnungspositionen verwendet, um auf Spaltenwerte und Parameter zuzugreifen, sollte wie folgt aussehen:

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));
          }
        }
      }
    }
  }
}

Es sollte ein Ergebnis ähnlich dem folgenden angezeigt werden:

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

Nächster Schritt