@@ -30,86 +30,118 @@ private static IDictionary<string, object> GetDictionaryOfValues(IDictionary<str
3030
3131 private static object GetBigQueryValue ( IDictionary < string , IEnumerable < PropertyInfo > > dictionaryOfProperties , PropertyInfo property , object obj ) {
3232 switch ( property . PropertyType . Name . ToUpper ( ) ) {
33+ case "IENUMERABLE`1" :
34+ return GetArrayFromEnumreable ( dictionaryOfProperties , property , obj ) ;
35+ case "NULLABLE`1" :
36+ var value = property . GetValue ( obj ) ;
37+ if ( value == null ) {
38+ return null ;
39+ } else {
40+ var propertyTypeName = property . PropertyType . GenericTypeArguments [ 0 ] . Name ;
41+ return GetNonEnumerableBigQueryValue ( propertyTypeName , value ) ;
42+ }
43+ }
44+
45+ if ( property . PropertyType . IsClass && property . PropertyType . Namespace != "System" ) { //crappy but works for now
46+ if ( property . PropertyType . IsArray ) {
47+ var array = ( IEnumerable < object > ) property . GetValue ( obj ) ;
48+ return GetSubEntitiesBigQueryInsertRows ( dictionaryOfProperties , array ) ;
49+ } else {
50+ var value = property . GetValue ( obj ) ;
51+ if ( value == null ) {
52+ return null ;
53+ } else {
54+ return GetSubEntitiesBigQueryInsertRows ( dictionaryOfProperties , new List < object > { value } ) . First ( ) ;
55+ }
56+ }
57+ }
58+
59+ return GetNonEnumerableBigQueryValue ( property . PropertyType . Name , property . GetValue ( obj ) ) ;
60+ }
61+
62+ private static object GetNonEnumerableBigQueryValue ( string propertyTypeName , object value ) {
63+ switch ( propertyTypeName . ToUpper ( ) ) {
3364 case "BYTE" :
34- return ( int ) ( byte ) property . GetValue ( obj ) ;
65+ return ( int ) ( byte ) value ;
3566 case "CHAR" :
36- return ( ( char ) property . GetValue ( obj ) ) . ToString ( ) ;
67+ return ( ( char ) value ) . ToString ( ) ;
3768 case "CHAR[]" :
38- return ( ( char [ ] ) property . GetValue ( obj ) ) . ToString ( ) ;
69+ return ( ( char [ ] ) value ) . ToString ( ) ;
3970 case "DATETIME" :
40- var datetimeValue = ( DateTime ) property . GetValue ( obj ) ;
41- return datetimeValue . ToString ( BigQueryDateTimeFormat , cultureUS ) ;
71+ return ( ( DateTime ) value ) . ToString ( BigQueryDateTimeFormat , cultureUS ) ;
72+ case "DATETIMEOFFSET" :
73+ return ( ( DateTimeOffset ) value ) . ToString ( BigQueryDateTimeFormat , cultureUS ) ;
4274 case "DECIMAL" :
43- return ( float ) ( decimal ) property . GetValue ( obj ) ;
75+ return ( float ) ( decimal ) value ;
4476 case "GUID" :
45- return ( ( Guid ) property . GetValue ( obj ) ) . ToString ( ) ;
77+ return ( ( Guid ) value ) . ToString ( ) ;
4678 case "UINT64" :
47- return ( int ) ( UInt64 ) property . GetValue ( obj ) ;
48- case "IENUMERABLE`1" :
49- var enumerableValue = property . GetValue ( obj ) ;
50-
51- Type innerPropertyType = property . PropertyType . GenericTypeArguments [ 0 ] ;
52- switch ( innerPropertyType . Name . ToUpper ( ) ) {
53- case "BYTE" :
54- return enumerableValue ;
55- case "BOOLEAN" :
56- return ( ( bool [ ] ) enumerableValue ) ;
57- case "CHAR" :
58- return ( ( char [ ] ) enumerableValue ) . ToString ( ) ;
59- case "DATETIME" :
60- return ( DateTime [ ] ) enumerableValue ;
61- case "DATETIMEOFFSET" :
62- return ( DateTimeOffset [ ] ) enumerableValue ;
63- case "DOUBLE" :
64- return ( ( double [ ] ) enumerableValue ) . Select ( c => ( float ) c ) . ToArray ( ) ;
65- case "DECIMAL" :
66- return ( ( decimal [ ] ) enumerableValue ) . Select ( c => ( float ) c ) . ToArray ( ) ;
67- case "SINGLE" :
68- return ( ( float [ ] ) enumerableValue ) ;
69- case "GUID" :
70- return ( ( Guid [ ] ) enumerableValue ) . Select ( c => c . ToString ( ) ) . ToArray ( ) ;
71- case "UINT16" :
72- return ( ( UInt16 [ ] ) enumerableValue ) ;
73- case "INT16" :
74- return ( ( Int16 [ ] ) enumerableValue ) ;
75- case "INT" :
76- case "INT32" :
77- return ( ( int [ ] ) enumerableValue ) ;
78- case "UINT32" :
79- return ( ( UInt32 [ ] ) enumerableValue ) ;
80- case "INT64" :
81- return ( ( Int64 [ ] ) enumerableValue ) ;
82- case "UINT64" :
83- return ( ( UInt64 [ ] ) enumerableValue ) ;
84- default :
85- if ( property . PropertyType . IsArray ) {
86- return enumerableValue ;
87- }
88-
89- IEnumerable < object > ie = ( IEnumerable < object > ) enumerableValue ;
90- if ( innerPropertyType . IsClass && innerPropertyType . Namespace != "System" ) {
91- return ( IEnumerable < Dictionary < string , object > > ) ie . Select ( c => GetDictionaryOfValues ( dictionaryOfProperties , c ) ) . ToArray ( ) ;
92- } else {
93- var length = ie . Count ( ) ;
94- var i = Array . CreateInstance ( innerPropertyType , length ) ;
95- Array . Copy ( ie . ToArray ( ) , i , length ) ;
96- return i ;
97- }
98- }
79+ return ( int ) ( UInt64 ) value ;
80+ default :
81+ return value ;
82+ }
83+ }
9984
85+ private static object GetArrayFromEnumreable ( IDictionary < string , IEnumerable < PropertyInfo > > dictionaryOfProperties , PropertyInfo property , object obj ) {
86+ var enumerableValue = property . GetValue ( obj ) ;
87+
88+ Type innerPropertyType = property . PropertyType . GenericTypeArguments [ 0 ] ;
89+ switch ( innerPropertyType . Name . ToUpper ( ) ) {
90+ case "BYTE" :
91+ return ( byte [ ] ) enumerableValue ;
92+ case "BOOLEAN" :
93+ return ( ( bool [ ] ) enumerableValue ) ;
94+ case "CHAR" :
95+ return ( ( char [ ] ) enumerableValue ) . ToString ( ) ;
96+ case "DATETIME" :
97+ return ( DateTime [ ] ) enumerableValue ;
98+ case "DATETIMEOFFSET" :
99+ return ( DateTimeOffset [ ] ) enumerableValue ;
100+ case "DOUBLE" :
101+ return ( ( double [ ] ) enumerableValue ) . Select ( c => ( float ) c ) . ToArray ( ) ;
102+ case "DECIMAL" :
103+ return ( ( decimal [ ] ) enumerableValue ) . Select ( c => ( float ) c ) . ToArray ( ) ;
104+ case "SINGLE" :
105+ return ( ( float [ ] ) enumerableValue ) ;
106+ case "GUID" :
107+ return ( ( Guid [ ] ) enumerableValue ) . Select ( c => c . ToString ( ) ) . ToArray ( ) ;
108+ case "UINT16" :
109+ return ( ( UInt16 [ ] ) enumerableValue ) ;
110+ case "INT16" :
111+ return ( ( Int16 [ ] ) enumerableValue ) ;
112+ case "INT" :
113+ case "INT32" :
114+ return ( ( int [ ] ) enumerableValue ) ;
115+ case "UINT32" :
116+ return ( ( UInt32 [ ] ) enumerableValue ) ;
117+ case "INT64" :
118+ return ( ( Int64 [ ] ) enumerableValue ) ;
119+ case "UINT64" :
120+ return ( ( UInt64 [ ] ) enumerableValue ) ;
100121 default :
101- if ( property . PropertyType . IsClass && property . PropertyType . Namespace != "System" ) { //crappy but works for now
102- if ( property . PropertyType . IsArray ) {
103- var array = ( IEnumerable < object > ) property . GetValue ( obj ) ;
104- //return array.Select(c => GetDictionaryOfValues(dictionaryOfProperties, c)).ToArray();
105- return null ;
106- } else {
107- return GetDictionaryOfValues ( dictionaryOfProperties , property . GetValue ( obj ) ) ;
108- }
122+ if ( property . PropertyType . IsArray ) {
123+ return enumerableValue ;
109124 }
110125
111- return property . GetValue ( obj ) ;
126+ IEnumerable < object > ie = ( IEnumerable < object > ) enumerableValue ;
127+ if ( innerPropertyType . IsClass && innerPropertyType . Namespace != "System" ) {
128+ return GetSubEntitiesBigQueryInsertRows ( dictionaryOfProperties , ie ) ;
129+ } else {
130+ var length = ie . Count ( ) ;
131+ var i = Array . CreateInstance ( innerPropertyType , length ) ;
132+ Array . Copy ( ie . ToArray ( ) , i , length ) ;
133+ return i ;
134+ }
135+ }
136+ }
137+
138+ private static BigQueryInsertRow [ ] GetSubEntitiesBigQueryInsertRows ( IDictionary < string , IEnumerable < PropertyInfo > > dictionaryOfProperties , IEnumerable < object > objs ) {
139+
140+ if ( objs . Count ( ) > 0 ) {
141+ return objs . Select ( c => new BigQueryInsertRow ( ) { GetDictionaryOfValues ( dictionaryOfProperties , c ) } ) . ToArray ( ) ;
112142 }
143+
144+ return new BigQueryInsertRow [ ] { } ;
113145 }
114146
115147 }
0 commit comments