public override async Task <IList <TElement> > ExecuteQueryAsync <TElement>(QueryString queryString, Action <TElement> onElementCreated) { IList <TElement> elements = new List <TElement>(); var propertiesDesc = new PropertyDescriptions(typeof(TElement).GetPropertyDescriptions()); using (var command = Client.CreateCommand(queryString.Value)) { using (DbDataReader reader = await command.ExecuteReaderAsync()) { string[] fields = reader.GetFields().ToArray(); while (await reader.ReadAsync()) { var element = new TElement(); for (int index = 0; index < fields.Length; index++) { if (reader.IsDBNull(index)) { continue; } propertiesDesc.SetValue(fields[index], reader.GetValue(index), element); } onElementCreated(element); elements.Add(element); } } } return(elements); }
/// <summary> /// Procedure call with list of elements as result (Asynchronous) /// </summary> /// <param name="procedureName">Name of the Procedure Call</param> /// <param name="input">Input for the procedure call</param> /// <returns>List of Elements</returns> public async Task <List <TModel> > ExecuteProcedureSegmentAsync <TModel>(string procedureName, object input = null) where TModel : class, new() { List <TModel> results = new List <TModel>(); IEnumerable <PropertyDescription> propertieList = typeof(TModel).GetPropertyDescriptions(); var propertiesDesc = new PropertyDescriptions(propertieList); using (DbCommand cmd = impl.CreateProcedureCall(procedureName)) { IEnumerable <DbParameter> parameters = GetInputParams(input) .Concat(GetOutParams(propertieList)); foreach (DbParameter paramter in parameters) { cmd.Parameters.Add(paramter); } using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { string[] fields = reader.GetFields().ToArray(); while (await reader.ReadAsync()) { var model = new TModel(); for (int index = 0; index < fields.Length; index++) { if (reader.IsDBNull(index)) { continue; } propertiesDesc.SetValue(fields[index], reader.GetValue(index), model); } results.Add(model); } } } return(results); }