Revenj.DatabasePersistence.Postgres.QueryGeneration.QueryComposition.QueryParts.FormatStringValues C# (CSharp) Method

FormatStringValues() private method

private FormatStringValues ( string name, Type type, object array ) : string
name string
type System.Type
array object
return string
        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)));
        }