Share via


Temel sorguları çalıştırmak için uygulama oluşturma

Bu makalede şunları öğreneceksiniz:

Önkoşullar

Kusto istemci kitaplığını kullanmak için geliştirme ortamınızı ayarlayın.

Temel bir sorgu çalıştırma ve sonuçları işleme

Tercih ettiğiniz IDE veya metin düzenleyicisinde, tercih ettiğiniz dile uygun kuralı kullanarak temel sorgu adlı bir proje veya dosya oluşturun. Ardından aşağıdaki kodu ekleyin:

  1. Yardım kümesine bağlanan bir istemci uygulaması oluşturun.

    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. Çalıştırılacak veritabanını ve sorguyu tanımlayın. Sorgu, toplam hasarın 100 milyon doları aştığı tarih, eyalet ve kasırgayla ilgili toplam hasarı döndürür.

    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. Sorguyu çalıştırın ve sonucu yazdırın.

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

Kodun tamamı şöyle görünmelidir:

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

Uygulamanızı çalıştırma

Komut kabuğunda aşağıdaki komutu kullanarak uygulamanızı çalıştırın:

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

Aşağıdakine benzer bir sonuç görmeniz gerekir:

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 $

Sütun değerlerine erişmek için sıralı konumları kullanma

Sorgu sonucundaki sütunların sırası bilindiğinde, sütunların değerlerine sonuç kümesindeki sıralı konumlarına göre erişmek, sütun adlarına göre daha verimlidir. İsteğe bağlı olarak, çalışma zamanında bir sütun sırasını sütun adından belirlemek için bir kitaplık yöntemi kullanabilirsiniz.

Not

veya project-away işleçlerini kullanarak project sorgu sonucundaki sütunların varlığını ve sırasını denetleyebilirsiniz.

Örneğin, önceki kodu, , Stateve DailyDamage sütunlarının değerlerine sonuç kümesindeki StartTimesıralı konumlarına göre erişecek şekilde değiştirebilirsiniz:

C# dilinde sütunların değerlerine yalnızca sonuç kümesindeki sıralı konumlarına göre erişebilirsiniz. Sütun adlarını kullanamazsınız; bu nedenle kod aynı kalır.

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

sorgu davranışını istemci isteği özellikleriyle özelleştirme

İstemci isteği özelliklerini ayarlayarak sorgunun davranışını özelleştirebilirsiniz. Kullanılabilir seçenekler hakkında daha fazla bilgi için bkz. istemci isteği özellikleri.

Örneğin, özel bir istek kimliği geçirmek ve sorgu zaman aşımını 1 dakikaya ayarlamak için önceki koddaki çağrıyı değiştirebilirsiniz kusto_client.execute_query . İstemci isteği özelliklerini kullanmak için sınıfını ClientRequestProperties içeri aktarmanız gerekir.

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

Kullanıcı girişini korumak için sorgu parametrelerini kullanma

Sorgu parametreleri, verilerinizin güvenliğini ve korumasını korumak için önemlidir. Verilerinize yetkisiz erişim elde etmeye veya verileri bozmaya çalışabilecek olası kötü amaçlı aktörlerden korur. Parametreli sorgular hakkında daha fazla bilgi için bkz. Sorgu parametreleri bildirim deyimi.

Örneğin, önceki kodu EventType değerini ve DailyDamage en düşük değerini sorguya parametre olarak geçirecek şekilde değiştirebilirsiniz. Parametreleri kullanmak için:

  1. Sorgu metnindeki parametreleri bildirme
  2. Sorgu metnindeki özellik değerlerini parametre adlarıyla değiştirme
  3. yürütme yöntemine geçirilen istemci isteği özelliklerindeki parametre değerlerini ayarlama
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));
  }
}

Sütun değerlerine ve parametrelerine erişmek için sıralı konumları kullanan kodun tamamı şöyle görünmelidir:

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

Aşağıdakine benzer bir sonuç görmeniz gerekir:

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

Sonraki adım