@@ -52,6 +52,23 @@ public class SaleView
52
52
public int AmountCents { get ; set ; }
53
53
}
54
54
55
+ public class SaleJson : Sale
56
+ {
57
+ public string Json { get ; set ; }
58
+
59
+ private List < ContactIssue > results ;
60
+ public List < ContactIssue > Results => results ??= CustomJsonSerializer . FromJson < List < ContactIssue > > ( Json ) ;
61
+ }
62
+
63
+ public static class CustomJsonSerializer
64
+ {
65
+ public static T FromJson < T > ( string json )
66
+ {
67
+ using var scope = JsConfig . With ( new Config { PropertyConvention = PropertyConvention . Lenient } ) ;
68
+ return json . FromJson < T > ( ) ;
69
+ }
70
+ }
71
+
55
72
[ TestFixtureOrmLite ]
56
73
public class MultipleSelfJoinsWithTableAliases : OrmLiteProvidersTestBase
57
74
{
@@ -99,67 +116,65 @@ private static Sale PopulateData(IDbConnection db, Guid tenantId)
99
116
[ Test ]
100
117
public void Can_use_custom_SqlExpression_to_add_multiple_self_Left_Joins_with_TableAlias ( )
101
118
{
102
- using ( var db = OpenDbConnection ( ) )
103
- {
104
- var tenantId = Guid . NewGuid ( ) ;
105
- var sale = PopulateData ( db , tenantId ) ;
106
-
107
- var q = db . From < Sale > ( )
108
- . CustomJoin ( "LEFT JOIN {0} seller on (Sale.{1} = seller.Id)"
109
- . Fmt ( "ContactIssue" . SqlTable ( DialectProvider ) , "SellerId" . SqlColumn ( DialectProvider ) ) )
110
- . CustomJoin ( "LEFT JOIN {0} buyer on (Sale.{1} = buyer.Id)"
111
- . Fmt ( "ContactIssue" . SqlTable ( DialectProvider ) , "BuyerId" . SqlColumn ( DialectProvider ) ) )
112
- . Select ( @"Sale.*
119
+ using var db = OpenDbConnection ( ) ;
120
+ var tenantId = Guid . NewGuid ( ) ;
121
+ var sale = PopulateData ( db , tenantId ) ;
122
+
123
+ var q = db . From < Sale > ( )
124
+ . CustomJoin ( "LEFT JOIN {0} seller on (Sale.{1} = seller.Id)"
125
+ . Fmt ( "ContactIssue" . SqlTable ( DialectProvider ) , "SellerId" . SqlColumn ( DialectProvider ) ) )
126
+ . CustomJoin ( "LEFT JOIN {0} buyer on (Sale.{1} = buyer.Id)"
127
+ . Fmt ( "ContactIssue" . SqlTable ( DialectProvider ) , "BuyerId" . SqlColumn ( DialectProvider ) ) )
128
+ . Select ( @"Sale.*
113
129
, buyer.{0} AS BuyerFirstName
114
130
, buyer.{1} AS BuyerLastName
115
131
, seller.{0} AS SellerFirstName
116
132
, seller.{1} AS SellerLastName"
117
133
. Fmt ( "FirstName" . SqlColumn ( DialectProvider ) , "LastName" . SqlColumn ( DialectProvider ) ) ) ;
118
134
119
- q . Where ( x => x . TenantId == tenantId ) ;
135
+ q . Where ( x => x . TenantId == tenantId ) ;
120
136
121
- var sales = db . Select < SaleView > ( q ) ;
122
- Assert . That ( sales . Count , Is . EqualTo ( 1 ) ) ;
137
+ var sales = db . Select < SaleView > ( q ) ;
138
+ Assert . That ( sales . Count , Is . EqualTo ( 1 ) ) ;
123
139
124
- //Alternative
125
- q = db . From < Sale > ( )
126
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
127
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
128
- . Select < Sale , ContactIssue > ( ( s , c ) => new
129
- {
130
- s ,
131
- BuyerFirstName = Sql . TableAlias ( c . FirstName , "buyer" ) ,
132
- BuyerLastName = Sql . TableAlias ( c . LastName , "buyer" ) ,
133
- SellerFirstName = Sql . TableAlias ( c . FirstName , "seller" ) ,
134
- SellerLastName = Sql . TableAlias ( c . LastName , "seller" ) ,
135
- } ) ;
140
+ //Alternative
141
+ q = db . From < Sale > ( )
142
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
143
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
144
+ . Select < Sale , ContactIssue > ( ( s , c ) => new
145
+ {
146
+ s ,
147
+ BuyerFirstName = Sql . TableAlias ( c . FirstName , "buyer" ) ,
148
+ BuyerLastName = Sql . TableAlias ( c . LastName , "buyer" ) ,
149
+ SellerFirstName = Sql . TableAlias ( c . FirstName , "seller" ) ,
150
+ SellerLastName = Sql . TableAlias ( c . LastName , "seller" ) ,
151
+ } ) ;
136
152
137
- q . Where ( x => x . TenantId == tenantId ) ;
153
+ q . Where ( x => x . TenantId == tenantId ) ;
138
154
139
- sales = db . Select < SaleView > ( q ) ;
140
- Assert . That ( sales . Count , Is . EqualTo ( 1 ) ) ;
155
+ sales = db . Select < SaleView > ( q ) ;
156
+ Assert . That ( sales . Count , Is . EqualTo ( 1 ) ) ;
141
157
142
158
143
- var salesView = sales [ 0 ] ;
159
+ var salesView = sales [ 0 ] ;
144
160
145
- //salesView.PrintDump();
161
+ //salesView.PrintDump();
146
162
147
- Assert . That ( salesView . Id , Is . EqualTo ( sale . Id ) ) ;
148
- Assert . That ( salesView . TenantId , Is . EqualTo ( sale . TenantId ) ) ;
149
- Assert . That ( salesView . AmountCents , Is . EqualTo ( sale . AmountCents ) ) ;
150
- Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
151
- Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
152
- Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
153
- Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
163
+ Assert . That ( salesView . Id , Is . EqualTo ( sale . Id ) ) ;
164
+ Assert . That ( salesView . TenantId , Is . EqualTo ( sale . TenantId ) ) ;
165
+ Assert . That ( salesView . AmountCents , Is . EqualTo ( sale . AmountCents ) ) ;
166
+ Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
167
+ Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
168
+ Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
169
+ Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
154
170
155
- q . Select ( "seller.*, 0 EOT, buyer.*" ) ;
171
+ q . Select ( "seller.*, 0 EOT, buyer.*" ) ;
156
172
157
- var multi = db . Select < Tuple < ContactIssue , ContactIssue > > ( q ) ;
158
- multi . PrintDump ( ) ;
173
+ var multi = db . Select < Tuple < ContactIssue , ContactIssue > > ( q ) ;
174
+ multi . PrintDump ( ) ;
159
175
160
- Assert . That ( multi [ 0 ] . Item1 . FirstName , Is . EqualTo ( "SellerFirst" ) ) ;
161
- Assert . That ( multi [ 0 ] . Item2 . FirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
162
- }
176
+ Assert . That ( multi [ 0 ] . Item1 . FirstName , Is . EqualTo ( "SellerFirst" ) ) ;
177
+ Assert . That ( multi [ 0 ] . Item2 . FirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
163
178
}
164
179
165
180
[ Test ]
@@ -174,35 +189,33 @@ public void Can_use_CustomSql_with_TableAlias()
174
189
if ( string . IsNullOrEmpty ( customFmt ) )
175
190
return ;
176
191
177
- using ( var db = OpenDbConnection ( ) )
178
- {
179
- var tenantId = Guid . NewGuid ( ) ;
180
- var sale = PopulateData ( db , tenantId ) ;
181
-
182
- var q = db . From < Sale > ( )
183
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
184
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
185
- . Select < Sale , ContactIssue > ( ( s , c ) => new
186
- {
187
- s ,
188
- BuyerFirstName = Sql . TableAlias ( c . FirstName , "buyer" ) ,
189
- BuyerLastName = Sql . TableAlias ( c . LastName , "buyer" ) ,
190
- BuyerInitials = Sql . Custom ( customFmt . Fmt ( "buyer.FirstName" , "buyer.LastName" ) ) ,
191
- SellerFirstName = Sql . TableAlias ( c . FirstName , "seller" ) ,
192
- SellerLastName = Sql . TableAlias ( c . LastName , "seller" ) ,
193
- SellerInitials = Sql . Custom ( customFmt . Fmt ( "seller.FirstName" , "seller.LastName" ) ) ,
194
- } ) ;
195
-
196
- var sales = db . Select < SaleView > ( q ) ;
197
- var salesView = sales [ 0 ] ;
198
-
199
- Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
200
- Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
201
- Assert . That ( salesView . BuyerInitials , Is . EqualTo ( "BL" ) ) ;
202
- Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
203
- Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
204
- Assert . That ( salesView . SellerInitials , Is . EqualTo ( "SL" ) ) ;
205
- }
192
+ using var db = OpenDbConnection ( ) ;
193
+ var tenantId = Guid . NewGuid ( ) ;
194
+ var sale = PopulateData ( db , tenantId ) ;
195
+
196
+ var q = db . From < Sale > ( )
197
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
198
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
199
+ . Select < Sale , ContactIssue > ( ( s , c ) => new
200
+ {
201
+ s ,
202
+ BuyerFirstName = Sql . TableAlias ( c . FirstName , "buyer" ) ,
203
+ BuyerLastName = Sql . TableAlias ( c . LastName , "buyer" ) ,
204
+ BuyerInitials = Sql . Custom ( customFmt . Fmt ( "buyer.FirstName" , "buyer.LastName" ) ) ,
205
+ SellerFirstName = Sql . TableAlias ( c . FirstName , "seller" ) ,
206
+ SellerLastName = Sql . TableAlias ( c . LastName , "seller" ) ,
207
+ SellerInitials = Sql . Custom ( customFmt . Fmt ( "seller.FirstName" , "seller.LastName" ) ) ,
208
+ } ) ;
209
+
210
+ var sales = db . Select < SaleView > ( q ) ;
211
+ var salesView = sales [ 0 ] ;
212
+
213
+ Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
214
+ Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
215
+ Assert . That ( salesView . BuyerInitials , Is . EqualTo ( "BL" ) ) ;
216
+ Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
217
+ Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
218
+ Assert . That ( salesView . SellerInitials , Is . EqualTo ( "SL" ) ) ;
206
219
}
207
220
208
221
[ Test ]
@@ -275,47 +288,67 @@ void AssertTupleResults(List<Tuple<Sale, ContactIssue, ContactIssue>> results)
275
288
[ Test ]
276
289
public void Can_use_Custom_Select_with_Tuples_with_TableAlias ( )
277
290
{
278
- using ( var db = OpenDbConnection ( ) )
279
- {
280
- var tenantId = Guid . NewGuid ( ) ;
281
- var sale = PopulateData ( db , tenantId ) ;
291
+ using var db = OpenDbConnection ( ) ;
292
+ var tenantId = Guid . NewGuid ( ) ;
293
+ var sale = PopulateData ( db , tenantId ) ;
282
294
283
- var q = db . From < Sale > ( )
284
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
285
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
286
- . Select ( "Sale.*, 0 EOT, buyer.*, 0 EOT, seller.*, 0 EOT" ) ;
295
+ var q = db . From < Sale > ( )
296
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
297
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
298
+ . Select ( "Sale.*, 0 EOT, buyer.*, 0 EOT, seller.*, 0 EOT" ) ;
287
299
288
- AssertTupleResults ( db . Select < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
300
+ AssertTupleResults ( db . Select < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
289
301
290
- q = db . From < Sale > ( )
291
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
292
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) ) ;
302
+ q = db . From < Sale > ( )
303
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
304
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) ) ;
293
305
294
- AssertTupleResults ( db . SelectMulti < Sale , ContactIssue , ContactIssue > ( q , new [ ] { "Sale.*" , "buyer.*" , "seller.*" } ) ) ;
295
- }
306
+ AssertTupleResults ( db . SelectMulti < Sale , ContactIssue , ContactIssue > ( q , new [ ] { "Sale.*" , "buyer.*" , "seller.*" } ) ) ;
296
307
}
297
308
298
309
[ Test ]
299
310
public async Task Can_use_Custom_Select_with_Tuples_with_TableAlias_Async ( )
300
311
{
301
- using ( var db = OpenDbConnection ( ) )
302
- {
303
- var tenantId = Guid . NewGuid ( ) ;
304
- var sale = PopulateData ( db , tenantId ) ;
312
+ using var db = await OpenDbConnectionAsync ( ) ;
313
+ var tenantId = Guid . NewGuid ( ) ;
314
+ var sale = PopulateData ( db , tenantId ) ;
305
315
306
- var q = db . From < Sale > ( )
307
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
308
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
309
- . Select ( "Sale.*, 0 EOT, buyer.*, 0 EOT, seller.*, 0 EOT" ) ;
316
+ var q = db . From < Sale > ( )
317
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
318
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) )
319
+ . Select ( "Sale.*, 0 EOT, buyer.*, 0 EOT, seller.*, 0 EOT" ) ;
310
320
311
- AssertTupleResults ( await db . SelectAsync < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
321
+ AssertTupleResults ( await db . SelectAsync < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
312
322
313
- q = db . From < Sale > ( )
314
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
315
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) ) ;
323
+ q = db . From < Sale > ( )
324
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
325
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . TableAlias ( "buyer" ) ) ;
326
+
327
+ AssertTupleResults ( await db . SelectMultiAsync < Sale , ContactIssue , ContactIssue > ( q , new [ ] { "Sale.*" , "buyer.*" , "seller.*" } ) ) ;
328
+ }
316
329
317
- AssertTupleResults ( await db . SelectMultiAsync < Sale , ContactIssue , ContactIssue > ( q , new [ ] { "Sale.*" , "buyer.*" , "seller.*" } ) ) ;
318
- }
319
- }
330
+ [ Test ]
331
+ public async Task Can_select_custom_result_with_json_type ( )
332
+ {
333
+ if ( ( Dialect & Dialect . AnyPostgreSql ) != Dialect )
334
+ return ;
335
+
336
+ using var db = await OpenDbConnectionAsync ( ) ;
337
+ var tenantId = Guid . NewGuid ( ) ;
338
+ var sale = PopulateData ( db , tenantId ) ;
339
+
340
+ var q = db . From < Sale > ( db . TableAlias ( "s" ) )
341
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . TableAlias ( "seller" ) )
342
+ . GroupBy ( x => x . Id )
343
+ . Select ( "s.*, json_agg(seller) as Json" ) ;
344
+
345
+ var values = db . Select < SaleJson > ( q ) ;
346
+ // values.PrintDump();
347
+ var result = values [ 0 ] . Results [ 0 ] ;
348
+ Assert . That ( result . Id , Is . Not . EqualTo ( default ( Guid ) ) ) ;
349
+ Assert . That ( result . TenantId , Is . EqualTo ( tenantId ) ) ;
350
+ Assert . That ( result . FirstName , Is . Not . Null ) ;
351
+ Assert . That ( result . LastName , Is . Not . Null ) ;
352
+ }
320
353
}
321
354
}
0 commit comments