Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 1c198ce

Browse files
committed
Add custom select example with typed json results
1 parent 24a831a commit 1c198ce

File tree

1 file changed

+135
-102
lines changed

1 file changed

+135
-102
lines changed

tests/ServiceStack.OrmLite.Tests/Issues/MultipleSelfJoinsWithTableAliases.cs

Lines changed: 135 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)