Dela via


Skapa en app för att köra grundläggande frågor

Gäller för: ✅Microsoft FabricAzure Data Explorer

I den här artikeln lär du dig att:

Förutsättningar

Konfigurera utvecklingsmiljön att använda Kusto-klientbiblioteket.

Kör en grundläggande fråga och bearbeta resultatet

I önskad IDE eller textredigerare skapar du ett projekt eller en fil med namnet grundläggande fråga med hjälp av den konvention som är lämplig för det språk du föredrar. Lägg sedan till följande kod:

  1. Skapa en klientapp som ansluter till hjälpkluster.

    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. Definiera databasen och frågan som ska köras. Frågan returnerar datum, tillstånd och total tornadorelaterad skada där den totala skadan översteg 100 miljoner dollar.

    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. Kör frågan och skriv ut resultatet.

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

Den fullständiga koden bör se ut så här:

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

Kör din app

I ett kommandogränssnitt använder du följande kommando för att köra appen:

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

Du bör se ett resultat som liknar följande:

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 $

Använd ordningstalspositioner för att komma åt kolumnvärden

När ordningen på kolumner i ett frågeresultat är känd är det mer effektivt att komma åt kolumnernas värden med deras ordningsföljdsposition i resultatuppsättningen än med deras kolumnnamn. Alternativt kan du vid körning använda en biblioteksmetod för att fastställa ett kolumnnummer från dess kolumnnamn.

Not

Du kan styra förekomsten och ordningen på kolumner i ett frågeresultat med hjälp av operatorerna project eller project-away.

Du kan till exempel ändra föregående kod för att komma åt värdena för StartTime, Stateoch DailyDamage kolumner efter deras ordningstal i resultatuppsättningen:

I C# kan du bara komma åt kolumnernas värden genom deras ordningstal i resultatuppsättningen. Du kan inte använda kolumnnamnen. Koden förblir därför densamma.

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

Anpassa frågebeteende med egenskaper för klientbegäran

Du kan anpassa beteendet för en fråga genom att ange egenskaper för klientbegäran. Mer information om tillgängliga alternativ finns i klientbegärans egenskaper.

Du kan till exempel ersätta kusto_client.execute_query-anropet i föregående kod för att skicka ett anpassat begärande-ID och ange tidsgränsen för frågan till 1 minut. Om du vill använda egenskaperna för klientbegäran måste du importera klassen ClientRequestProperties.

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

Använda frågeparametrar för att skydda användarindata

Frågeparametrar är viktiga för att upprätthålla säkerheten och skyddet av dina data. Den skyddar den från potentiella skadliga aktörer som kan försöka få obehörig åtkomst till eller skada dina data. Mer information om parametriserade frågor finns i deklarationsinstrukation för frågeparametrar.

Du kan till exempel ändra den tidigare koden för att skicka värdet EventType och DailyDamage minsta värde som parametrar till frågan. Så här använder du parametrar:

  1. Deklarera parametrarna i frågetexten
  2. Ersätt egenskapsvärdena i frågetexten med parameternamnen
  3. Ange parametervärdena i egenskaperna för klientbegäran som skickas till körningsmetoden
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));
  }
}

Den fullständiga koden med hjälp av ordningstalspositioner för att komma åt kolumnvärden och parametrar bör se ut så här:

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

Du bör se ett resultat som liknar följande:

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

Nästa steg