Share via


Een app maken om basisquery's uit te voeren

In dit artikel leert u het volgende:

Vereisten

Stel uw ontwikkelomgeving in voor het gebruik van de Kusto-clientbibliotheek.

Een eenvoudige query uitvoeren en de resultaten verwerken

Maak in uw favoriete IDE of teksteditor een project of bestand met de naam Basisquery met behulp van de conventie die geschikt is voor uw voorkeurstaal. Voeg vervolgens de volgende code toe:

  1. Maak een client-app die verbinding maakt met het Help-cluster.

    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. Definieer de database en query die moet worden uitgevoerd. De query retourneert de datum, status en totale tornadogerelateerde schade waarbij de totale schade de 100 miljoen dollar overschrijdt.

    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. Voer de query uit en druk het resultaat af.

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

De volledige code moet er als volgt uitzien:

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

Voer uw app uit

Gebruik in een opdrachtshell de volgende opdracht om uw app uit te voeren:

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

Als het goed is, ziet u een resultaat dat er ongeveer als volgt uitziet:

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 $

Ordinale posities gebruiken om toegang te krijgen tot kolomwaarden

Wanneer de volgorde van kolommen in een queryresultaat bekend is, is het efficiƫnter om toegang te krijgen tot de waarden van de kolommen op basis van hun rangtele positie in de resultatenset dan op basis van hun kolomnaam. Optioneel kunt u tijdens runtime een bibliotheekmethode gebruiken om een kolomordinaal te bepalen op basis van de kolomnaam.

Notitie

U kunt de aanwezigheid en volgorde van kolommen in een queryresultaat bepalen met behulp van de project operators of project-away .

U kunt bijvoorbeeld de vorige code wijzigen om toegang te krijgen tot de waarden van de StartTimekolommen , Stateen DailyDamage op hun rangtelposities in de resultatenset:

In C# hebt u alleen toegang tot de waarden van de kolommen op basis van hun rangordinale positie in de resultatenset. U kunt de kolomnamen niet gebruiken. daarom blijft de code hetzelfde.

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

Querygedrag aanpassen met clientaanvraageigenschappen

U kunt het gedrag van een query aanpassen door eigenschappen van clientaanvragen in te stellen. Zie Eigenschappen van clientaanvragen voor meer informatie over beschikbare opties.

U kunt bijvoorbeeld de aanroep in de kusto_client.execute_query vorige code vervangen om een aangepaste aanvraag-id door te geven en de time-out van de query in te stellen op 1 minuut. Als u de eigenschappen van de clientaanvraag wilt gebruiken, moet u de ClientRequestProperties klasse importeren.

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

Queryparameters gebruiken om gebruikersinvoer te beveiligen

Queryparameters zijn belangrijk voor het onderhouden van de beveiliging en bescherming van uw gegevens. Het beschermt het tegen mogelijke kwaadwillende actoren die proberen onbevoegde toegang te krijgen tot uw gegevens of uw gegevens te beschadigen. Zie De instructie Queryparametersdeclaratie voor meer informatie over geparameteriseerde query's.

U kunt bijvoorbeeld de vorige code wijzigen om de EventType-waarde en de minimumwaarde DailyDamage als parameters door te geven aan de query. Parameters gebruiken:

  1. De parameters in de querytekst declareren
  2. Vervang de eigenschapswaarden in de querytekst door de parameternamen
  3. Stel de parameterwaarden in de eigenschappen van de clientaanvraag in die zijn doorgegeven aan de methode 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));
  }
}

De volledige code die gebruikmaakt van ordinale posities voor toegang tot kolomwaarden en parameters moet er als volgt uitzien:

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

Als het goed is, ziet u een resultaat dat er ongeveer als volgt uitziet:

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

Volgende stap