@@ -52,6 +52,23 @@ public class SaleView
5252 public int AmountCents { get ; set ; }
5353 }
5454
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+
5572 [ TestFixtureOrmLite ]
5673 public class MultipleSelfJoinsWithTableAliases : OrmLiteProvidersTestBase
5774 {
@@ -99,67 +116,65 @@ private static Sale PopulateData(IDbConnection db, Guid tenantId)
99116 [ Test ]
100117 public void Can_use_custom_SqlExpression_to_add_multiple_self_Left_Joins_with_TableAlias ( )
101118 {
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.*
113129 , buyer.{0} AS BuyerFirstName
114130 , buyer.{1} AS BuyerLastName
115131 , seller.{0} AS SellerFirstName
116132 , seller.{1} AS SellerLastName"
117133 . Fmt ( "FirstName" . SqlColumn ( DialectProvider ) , "LastName" . SqlColumn ( DialectProvider ) ) ) ;
118134
119- q . Where ( x => x . TenantId == tenantId ) ;
135+ q . Where ( x => x . TenantId == tenantId ) ;
120136
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 ) ) ;
123139
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+ } ) ;
136152
137- q . Where ( x => x . TenantId == tenantId ) ;
153+ q . Where ( x => x . TenantId == tenantId ) ;
138154
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 ) ) ;
141157
142158
143- var salesView = sales [ 0 ] ;
159+ var salesView = sales [ 0 ] ;
144160
145- //salesView.PrintDump();
161+ //salesView.PrintDump();
146162
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" ) ) ;
154170
155- q . Select ( "seller.*, 0 EOT, buyer.*" ) ;
171+ q . Select ( "seller.*, 0 EOT, buyer.*" ) ;
156172
157- var multi = db . Select < Tuple < ContactIssue , ContactIssue > > ( q ) ;
158- multi . PrintDump ( ) ;
173+ var multi = db . Select < Tuple < ContactIssue , ContactIssue > > ( q ) ;
174+ multi . PrintDump ( ) ;
159175
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" ) ) ;
163178 }
164179
165180 [ Test ]
@@ -174,35 +189,33 @@ public void Can_use_CustomSql_with_TableAlias()
174189 if ( string . IsNullOrEmpty ( customFmt ) )
175190 return ;
176191
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" ) ) ;
206219 }
207220
208221 [ Test ]
@@ -275,47 +288,67 @@ void AssertTupleResults(List<Tuple<Sale, ContactIssue, ContactIssue>> results)
275288 [ Test ]
276289 public void Can_use_Custom_Select_with_Tuples_with_TableAlias ( )
277290 {
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 ) ;
282294
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" ) ;
287299
288- AssertTupleResults ( db . Select < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
300+ AssertTupleResults ( db . Select < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
289301
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" ) ) ;
293305
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.*" } ) ) ;
296307 }
297308
298309 [ Test ]
299310 public async Task Can_use_Custom_Select_with_Tuples_with_TableAlias_Async ( )
300311 {
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 ) ;
305315
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" ) ;
310320
311- AssertTupleResults ( await db . SelectAsync < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
321+ AssertTupleResults ( await db . SelectAsync < Tuple < Sale , ContactIssue , ContactIssue > > ( q ) ) ;
312322
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+ }
316329
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+ }
320353 }
321354}
0 commit comments