public static void Update <T>(this IHop hopper, IEnumerable <T> instances) where T : new() { SchemaVerifierService.AddTypeToCache <T>(hopper.Connection); IIdExtractorService idExtractorService = HopBase.GetIdExtractorService(); List <T> instanceList = instances as List <T> ?? instances.ToList(); var sb = new StringBuilder(); int paramCounter = 0; using (var dbCommand = new SqlCommand()) { dbCommand.Connection = (SqlConnection)hopper.Connection; foreach (T inst in instanceList) { sb.AppendLine(string.Format("UPDATE {0} SET ", HopBase.GetTypeToTableNameService(typeof(T)))); sb.AppendLine( TypeCache.Get <T>().PropertiesWithoutId .Select((x, i) => { string paramName = string.Format("@param{0}{1}", paramCounter, i); object value = x.GetValue(inst, null); if (value == null) { return(string.Empty); } dbCommand.Parameters.Add(new SqlParameter(paramName, value)); return(string.Format("{0} = {1}", x.Name, paramName)); }) .Where(x => x != string.Empty) .Aggregate((set1, set2) => set1 + ", " + set2)); object instanceId = idExtractorService.GetId(inst); if (instanceId == null || HopBase.GetDefault(instanceId.GetType()).Equals(instanceId)) { throw new HopUpdateWithoutKeyException(inst); } sb.AppendLine(string.Format(" WHERE {0} = {1}", idExtractorService.GetIdField <T>(), instanceId)); paramCounter++; } dbCommand.CommandText = sb.ToString(); dbCommand.Connection.Open(); dbCommand.ExecuteNonQuery(); dbCommand.Connection.Close(); } }
public IEnumerable <T> ReadObjects <T>(IDataReader dataReader, Task <Materializer <T> > emitterTask) where T : new() { var selectedColumnNamesInOrder = Enumerable .Range(0, dataReader.FieldCount) .Select(x => new { ColumnName = dataReader.GetName(x), OrdinalIndex = x }) .Select(x => new { ColumName = x.ColumnName, PropertyInfo = TypeCache.Get <T>().Properties.FirstOrDefault(prop => prop.Name.ToLower() == x.ColumnName.ToLower()), OrindalIndex = x.OrdinalIndex }) .ToList(); while (dataReader.Read()) { var newObject = new T(); foreach (var filler in selectedColumnNamesInOrder) { var value = dataReader.GetValue(filler.OrindalIndex); filler.PropertyInfo.SetValue(newObject, value is DBNull ? HopBase.GetDefault(filler.PropertyInfo.PropertyType) : value, null); } yield return(newObject); } }
public static IEnumerable <T> Read <T>(this IHop hopper, IEnumerable <T> instances) where T : new() { if (instances == null) { throw new ArgumentNullException("instances", "Read extension method expects an array of instances to read"); } var listInstances = instances as List <T> ?? instances.ToList(); if (!listInstances.Any()) { return(Enumerable.Empty <T>()); } var idExtractorService = HopBase.GetIdExtractorService(); var ids = idExtractorService.GetIds(listInstances).Select((x, i) => { if (HopBase.GetDefault(x.GetType()).Equals(x)) { throw new HopReadWithoutKeyException(listInstances[i]); } return(new SqlParameter(string.Format("@param{0}", i), x)); }).ToArray(); var idField = idExtractorService.GetIdField <T>(); var whereClause = ids.Select(p => p.ParameterName).Aggregate((p1, p2) => p1 + " , " + p2); var selectFrom = SelectFrom <T>(); var cmdText = string.Format("{0} WHERE {2} IN ( {1} )", selectFrom, whereClause, idField); using (var command = new SqlCommand()) { command.CommandText = cmdText; command.Parameters.AddRange(ids); return(hopper.ReadInternal <T>(command)); } }