private string FormatStringValues(string name, Type type, object[] array)
{
Type element = null;
if (type.IsGenericType || type.IsArray)
{
element = type.IsArray ? type.GetElementType() : type.GetGenericArguments()[0];
var converter = ConverterFactory.GetSerializationFactory(element);
if (converter != null)
{
var source = SqlSourceAttribute.FindSource(element)
?? "\"" + element.Namespace + "\".\"" + element.Name + "\"";
var arr = Postgres.PostgresTypedArray.ToArray(array, converter);
return @"(SELECT ""{2}"" FROM unnest({0}::{1}[]) ""{2}"") ""{2}""".With(
arr,
source,
name);
}
else if (!NpgsqlTypes.TypeConverter.CanConvert(element))
{
var fields = element.GetFields().Select(it => new ColumnValue(it));
var properties = element.GetProperties().Select(it => new ColumnValue(it));
var columns = fields.Union(properties).ToList();
return "(SELECT "
+ string.Join(", ", columns.Select((it, ind) => "column{0} AS \"{1}\"".With(ind + 1, it.Name)))
+ " FROM (VALUES"
+ string.Join(
", ",
array.Select(it => "(" + string.Join(", ", columns.Select(c => c.GetBackendValue(it))) + ")"))
+ ") _sq1 ) \"" + name + "\"";
}
}
var formated = (from i in array select FormatObject(i)).ToList();
var typeAlias = element != null && NpgsqlTypes.TypeConverter.CanConvert(element)
? "::" + NpgsqlTypes.TypeConverter.GetTypeName(element)
: string.Empty;
return
"(SELECT {0}{1} AS \"{2}\"{3}) AS \"{2}\"".With(
formated[0],
typeAlias,
name,
string.Concat(formated.Skip(1).Select(it => " UNION ALL SELECT " + it)));
}