/// <summary> /// Generates a Kusto table mapping for a specific <see cref="Type"/>, by mapping it's properties to column mappings. /// </summary> /// <param name="client">The <see cref="ICslAdminProvider"/> client that we are extending.</param> /// <param name="type">The <see cref="Type"/> that we are generating the JSON mapping for.</param> /// <returns>The name of the mapping created.</returns> public static async Task <string> GenerateTableJsonMappingFromType(this ICslAdminProvider client, Type type) { var tableName = type.Name; var mappingName = $"{tableName}_mapping"; var tableMappings = new List <string>(); var command = CslCommandGenerator.GenerateTableJsonMappingsShowCommand(tableName); var reader = await client.ExecuteControlCommandAsync(client.DefaultDatabaseName, command); while (reader.Read()) { tableMappings.Add(reader.GetString(0)); } if (tableMappings.Contains(mappingName)) { return(mappingName); } var mappings = type.GetProperties().Select(property => new JsonColumnMapping { ColumnName = property.Name, JsonPath = $"$.{property.Name}" }).ToList(); command = CslCommandGenerator.GenerateTableJsonMappingCreateCommand(tableName, mappingName, mappings); await client.ExecuteControlCommandAsync(client.DefaultDatabaseName, command); return(mappingName); }
/// <summary> /// Check table for existense of JSON mapping and create one if necessary /// </summary> /// <param name="kcsb">KustoConnectionStringBuilder object configured to connect to the cluster</param> /// <param name="databaseName">Name of the database</param> /// <param name="tableName">Name of the table</param> static void CreateJsonMappingIfNotExists(KustoConnectionStringBuilder kcsb, string databaseName, string tableName) { using (var adminClient = KustoClientFactory.CreateCslAdminProvider(kcsb)) { var showMappingsCommand = CslCommandGenerator.GenerateTableJsonMappingsShowCommand(tableName); var existingMappings = adminClient.ExecuteControlCommand <IngestionMappingShowCommandResult>(databaseName, showMappingsCommand); if (existingMappings.FirstOrDefault(m => String.Equals(m.Name, s_jsonMappingName, StringComparison.Ordinal)) != null) { return; } var createMappingCommand = CslCommandGenerator.GenerateTableJsonMappingCreateCommand(tableName, s_jsonMappingName, s_jsonMapping); adminClient.ExecuteControlCommand(databaseName, createMappingCommand); } }