internal static void AddParametersToCommand(this ISqlTemplate template, DbCommand command, DataService dataService) { if (template == null) { throw new ArgumentNullException(nameof(template)); } if (command == null) { throw new ArgumentNullException(nameof(command)); } Type templateType = template.GetType(); var getters = templateType.GetPropertyGetters(); var parameterPrefix = dataService.EntityLiteProvider.ParameterPrefix; foreach (var pi in templateType.GetProperties()) { var attrs = pi.GetCustomAttributes(typeof(DbParameterAttribute), false); if (attrs.Length > 0) { var parameterAttr = (DbParameterAttribute)attrs[0]; IDbDataParameter parameter = command.CreateParameter(); parameter.ParameterName = parameterPrefix + pi.Name; parameter.SourceColumn = pi.Name; if (parameterAttr.ProviderType == int.MaxValue) { parameter.DbType = parameterAttr.DbType; } else { dataService.EntityLiteProvider.SetProviderTypeToParameter(parameter, parameterAttr.ProviderType); } parameter.Direction = parameterAttr.Direction; if (parameterAttr.Size != 0) { parameter.Size = parameterAttr.Size; } if (parameterAttr.Precision != 0) { parameter.Precision = parameterAttr.Precision; } if (parameterAttr.Scale != 0) { parameter.Scale = parameterAttr.Scale; } object propValue = getters[pi.Name](template); parameter.Value = propValue == null ? DBNull.Value : propValue; command.Parameters.Add(parameter); } attrs = pi.GetCustomAttributes(typeof(DbParameterSerieAttribute), false); if (attrs.Length > 0) { var parameterAttr = (DbParameterSerieAttribute)attrs[0]; object propValue = getters[pi.Name](template); if (propValue != null) { var items = propValue as IEnumerable; if (items == null) { throw new ArgumentException(pi.Name + " property is not enumerable. Properties decorated with DbParameterSerieAttribute must be enumerable"); } int i = 0; foreach (object item in items) { IDbDataParameter parameter = command.CreateParameter(); parameter.ParameterName = parameterPrefix + pi.Name + i.ToString(CultureInfo.InvariantCulture); parameter.SourceColumn = pi.Name + i.ToString(CultureInfo.InvariantCulture); if (parameterAttr.ProviderType == int.MaxValue) { parameter.DbType = parameterAttr.DbType; } else { dataService.EntityLiteProvider.SetProviderTypeToParameter(parameter, parameterAttr.ProviderType); } parameter.Direction = parameterAttr.Direction; if (parameterAttr.Size != 0) { parameter.Size = parameterAttr.Size; } if (parameterAttr.Precision != 0) { parameter.Precision = parameterAttr.Precision; } if (parameterAttr.Scale != 0) { parameter.Scale = parameterAttr.Scale; } parameter.Value = item == null ? DBNull.Value : item; command.Parameters.Add(parameter); i++; } } } } }