public DataRecordConverterTypeBuilder(DataRecordConverterSpec queryInfo)
		{
			_queryInfo = Verify.ArgumentNotNull(queryInfo, "queryInfo");

			PropertyInfo[] properties = queryInfo.RecordType.GetProperties();

			var propertyMap = new NameDictionary<PropertyInfo>();
			var dataRecordMap = new NameDictionary<DataRecordFieldInfo>();

			foreach (DataRecordFieldInfo field in queryInfo.Fields)
			{
				dataRecordMap.Add(field.FieldName, field);
			}

			foreach (PropertyInfo property in properties)
			{
				if (property.HasPublicSetter())
				{
					propertyMap.Add(property.Name, property);
				}
			}

			foreach (DataRecordFieldInfo field in queryInfo.Fields)
			{
				var propertyList = new PropertyList(queryInfo.RecordType, field.FieldName);
				if (propertyList.HasErrors)
				{
					_errors.AddRange(propertyList.Errors);
				}
				else if (DataRecordConverterMethod.CanHandleConversion(field.FieldType, propertyList.PropertyType))
				{
					_mapFieldToProperty.Add(field, propertyList);
				}
				else
				{
					_errors.Add(string.Format("Cannot convert from {0} to {1} for {2}",
					                          field.FieldType.Name, propertyList.PropertyType.Name, field.FieldName));
				}
			}

			foreach (PropertyInfo property in properties)
			{
				if (property.HasPublicSetter())
				{
					DataRecordFieldInfo field;
					if (dataRecordMap.TryGetValue(property.Name, out field))
					{
						_mapPropertyToField.Add(property, field);
					}
					else
					{
						_errors.Add(string.Format("Query result does not have a column named '{0}'",
						                          property.Name));
					}
				}
			}
		}