public async Task <T> Handle(NpgsqlDataReader reader) { var meta = ClassDbMeta <T> .Instance; var columns = await reader.GetColumnSchemaAsync(); if (await reader.ReadAsync()) { var t = Activator.CreateInstance <T>(); foreach (DbColumn column in columns) { var prop = meta.GetPropertyInfo(column.ColumnName); if (prop == null) { continue; } int ordinal = column.ColumnOrdinal.Value; Type valueTyp = prop.PropertyType; object value = Tool.DefaultValueFormColumnToProp(reader, ordinal, valueTyp); prop.SetValue(t, value); } return(t); } else { return(default);
/// <summary> /// Executes a Query asynchronously /// </summary> /// <param name="context">Database Context</param> /// <param name="query">SQL</param> /// <param name="parameters">Parameters</param> /// <returns>awaitable Task</returns> public static async Task <IReadOnlyDictionary <string, object>[]> NpgsqlQueryAsync(this DatabaseContext context, string query, NpgsqlParameter[] parameters = null) { //Place to store Results List <IReadOnlyDictionary <string, object> > results = new(); //Create and Open Connection NpgsqlConnection connection = new(context.GetNpgsqlConnectionString()); await connection.OpenAsync(); //Create command with `query` Command Text NpgsqlCommand cmd = connection.CreateCommand(); cmd.CommandText = query; //Add Parameters if present if (parameters != null) { cmd.Parameters.AddRange(parameters); } //Execute Data Reader await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); //Read Columns ReadOnlyCollection <NpgsqlDbColumn> columns = await reader.GetColumnSchemaAsync(); //Read Results while (await reader.ReadAsync()) { //Place to store Result Dictionary <string, object> result = new(); //Create Object Array with the size of the amount of columns object[] values = new object[columns.Count]; //Get Values reader.GetValues(values); //Iterate over each column for (int i = 0; i < columns.Count; i++) { //Get Column NpgsqlDbColumn column = columns[i]; //Add Result result.Add(column.ColumnName, values[i]); } //Add Result to Results results.Add(result); } //Close Connection await connection.CloseAsync(); //Return Results return(results.ToArray()); }
private async Task <ReadOnlyCollection <Schema.NpgsqlDbColumn> > GetColumnSchema(NpgsqlDataReader reader) => IsAsync ? await reader.GetColumnSchemaAsync() : reader.GetColumnSchema();