Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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));
            }
        }