private List <T> query <T>(Query query, RowReaderCallback <T> callback, bool firstOnly = false) { List <T> result = new List <T>(); using (var sql = connect()) { using (var cmd = new SqlCommand(useDatabase(query.build()), sql)) { foreach (var a in query.arguments) { if (a.Value != null) { cmd.Parameters.AddWithValue(a.Key, a.Value); } } sql.Open(); using (var dr = cmd.ExecuteReader()) { var reader = new RowReader(dr); while (dr.Read()) { result.Add(callback(reader)); if (firstOnly) { break; } } } } } return(result); }
/// <summary> /// Reads the data from the currently processed row /// </summary> /// <param name="reader"></param> protected virtual void readRow(RowReader reader) { __ard = true; foreach (var field in __def.fields.Values) { var f = getField(field.name); if (f == null) { throw new ModelDefinitionException("target type does not implement model field " + field.name); } var v = reader.read(field.column, field.type); if (v != null && v.GetType() == typeof(NDateTime)) { v = (v as NDateTime).dt; } this[field.name] = v; var _ref = field.reference; if (_ref != null && _ref.container != null) { var _obj = typeof(Model) .GetMethod("getFirst") .MakeGenericMethod(_ref.model) .Invoke(null, new object[] { new Where.Equals(_ref.field, this[field.name]) }); this[_ref.container] = _obj; } } }