/// <summary> /// Converts a list of DynamicResult records into a DataTable /// </summary> /// <param name="data">the list of dynamicresult that is being converted into a datatable</param> /// <param name="extensionForRowInResult">when provided adds a new field in the DynamicResult and maps back the generated data-row to each Record</param> /// <returns>the datatable containing the items</returns> public static DataTable ToDataTable(this IEnumerable <DynamicResult> data, string extensionForRowInResult = null) { DataTable retVal = new DataTable(); DynamicResult first = data.FirstOrDefault(); if (first != null) { string[] names = first.GetDynamicMemberNames().ToArray(); foreach (string s in names) { retVal.Columns.Add(s, GetTableType(first.GetType(s))); } foreach (DynamicResult res in data) { DataRow row = retVal.NewRow(); foreach (string s in names) { row[s] = res[s] ?? DBNull.Value; } if (extensionForRowInResult != null) { res.Extendable = true; res[extensionForRowInResult] = row; } retVal.Rows.Add(row); } } return(retVal); }
/// <summary> /// Inserts a record into the specified table with the specified values /// </summary> /// <param name="value">the result containing the items inserted into the table</param> /// <param name="tableName">the tablename in which to insert the data</param> /// <param name="hardcodedValues">values that are hardcoded</param> public void InsertRecord(DynamicResult value, string tableName, Dictionary <string, string> hardcodedValues) { List <string> fields = new List <string>(hardcodedValues.Keys); List <string> values = new List <string>((from t in fields select hardcodedValues[t])); IDbDataParameter[] parameters = (from t in value.GetDynamicMemberNames() select GetParameter(t, value[t]) as IDbDataParameter).ToArray(); (from t in value.GetDynamicMemberNames() select t).ToList().ForEach(fields.Add); (from t in value.GetDynamicMemberNames() select $"@{t}").ToList().ForEach(values.Add); string cmd = string.Format(SqlCommands.InsertWithGetIdentity, tableName, string.Join(",", fields), string.Join(",", values)); int id = ExecuteCommandScalar <int>(cmd, parameters); if (value.Controller != null) { value.Controller.SetIndex(value, id); } }
/// <summary> /// Maps the data of the dynamicResult instance into the T - Instance /// </summary> /// <param name="item">the item that contains the original data</param> /// <param name="target">the target instance into which the data is mapped</param> /// <param name="modelType">the meta-type used to identify mapped columns</param> public static void ToModel(this DynamicResult item, object target, Type modelType) { string[] fieldNames = item.GetDynamicMemberNames().ToArray(); MapRule[] rules = DbColumnAttribute.GetRules(modelType).Clone() as MapRule[]; for (int i = 0; i < rules.Length; i++) { MapRule r = rules[i]; if (r != null && fieldNames.Any(n => n.Equals(r.FieldName, StringComparison.OrdinalIgnoreCase)))//Array.IndexOf(fieldNames, r.FieldName.ToLower()) != -1)))) { try { object val = item[r.FieldName]; if (!r.UseExpression) { r[target] = val; } else { r[target] = ProcessResolveExpression(r.ValueResolveExpression, val); } } catch (Exception ex) { LogEnvironment.LogEvent(string.Format("Failed to set value{1}{0}", ex.OutlineException(), Environment.NewLine), LogSeverity.Warning, "DataAccess"); } } else if (r != null) { LogEnvironment.LogDebugEvent($"No Value found for MapRule {r.FieldName} ({r.UseExpression};{r.ValueResolveExpression}", LogSeverity.Report); } } }
private static void CopyToDictionary(DynamicResult item, IDictionary <string, object> target, bool extendWithUppercase) { string[] fieldNames = item.GetDynamicMemberNames().ToArray(); foreach (var fieldName in fieldNames) { target.Add(fieldName, item[fieldName]); if (extendWithUppercase && fieldName.ToUpper() != fieldName) { target.Add(fieldName.ToUpper(), item[fieldName]); } } }
/// <summary> /// Inserts a record into the specified table with the specified values /// </summary> /// <param name="value">the result containing the items inserted into the table</param> /// <param name="tableName">the tablename in which to insert the data</param> /// <param name="hardcodedValues">values that are hardcoded</param> public void InsertRecord(DynamicResult value, string tableName, Dictionary <string, string> hardcodedValues) { List <string> fields = new List <string>(hardcodedValues.Keys); List <string> values = new List <string>((from t in fields select hardcodedValues[t])); var parameters = (from t in value.GetDynamicMemberNames() select new { Field = t, Param = GetParameter(t, value[t]) as IDbDataParameter }).ToArray(); var par = new List <IDbDataParameter>(); parameters.ForEach(p => { fields.Add(p.Field); values.Add(p.Param.ParameterName); par.Add(p.Param); }); string cmd = string.Format(SqlCommands.InsertWithGetIdentity, tableName, string.Join(",", fields), string.Join(",", values)); int id = ExecuteCommandScalar <int>(cmd, par.ToArray()); if (value.Controller != null) { value.Controller.SetIndex(value, id); } }