1
1
using System ;
2
+ using System . Data ;
2
3
using NUnit . Framework ;
3
4
using ServiceStack . DataAnnotations ;
4
5
using ServiceStack . Text ;
@@ -42,51 +43,61 @@ public class SaleView
42
43
public Guid TenantId { get ; set ; }
43
44
public string BuyerFirstName { get ; set ; }
44
45
public string BuyerLastName { get ; set ; }
46
+ public string BuyerInitials { get ; set ; }
45
47
public string SellerFirstName { get ; set ; }
46
48
public string SellerLastName { get ; set ; }
49
+ public string SellerInitials { get ; set ; }
47
50
public int AmountCents { get ; set ; }
48
51
}
49
52
50
53
public class MultipleSelfJoinsWithAliases : OrmLiteTestBase
51
54
{
52
- [ Test ]
53
- public void Can_use_cusom_SqlExpression_to_add_multiple_self_Left_Joins ( )
55
+ private static Sale PopulateData ( IDbConnection db , Guid tenantId )
54
56
{
55
- using ( var db = OpenDbConnection ( ) )
56
- {
57
- db . DropTable < Sale > ( ) ;
58
- db . DropTable < ContactIssue > ( ) ;
59
-
60
- db . CreateTable < ContactIssue > ( ) ;
61
- db . CreateTable < Sale > ( ) ;
57
+ db . DropTable < Sale > ( ) ;
58
+ db . DropTable < ContactIssue > ( ) ;
62
59
63
- var tenantId = Guid . NewGuid ( ) ;
60
+ db . CreateTable < ContactIssue > ( ) ;
61
+ db . CreateTable < Sale > ( ) ;
64
62
65
- var buyer = new ContactIssue {
66
- Id = Guid . NewGuid ( ) ,
67
- TenantId = tenantId ,
68
- FirstName = "Buyer" ,
69
- LastName = "LastBuyer"
70
- } ;
63
+ var buyer = new ContactIssue
64
+ {
65
+ Id = Guid . NewGuid ( ) ,
66
+ TenantId = tenantId ,
67
+ FirstName = "BuyerFirst" ,
68
+ LastName = "LastBuyer"
69
+ } ;
71
70
72
- var seller = new ContactIssue {
73
- Id = Guid . NewGuid ( ) ,
74
- TenantId = tenantId ,
75
- FirstName = "Seller" ,
76
- LastName = "LastSeller"
77
- } ;
71
+ var seller = new ContactIssue
72
+ {
73
+ Id = Guid . NewGuid ( ) ,
74
+ TenantId = tenantId ,
75
+ FirstName = "SellerFirst" ,
76
+ LastName = "LastSeller"
77
+ } ;
78
78
79
- db . Insert ( buyer , seller ) ;
79
+ db . Insert ( buyer , seller ) ;
80
80
81
- var sale = new Sale {
82
- Id = Guid . NewGuid ( ) ,
83
- TenantId = tenantId ,
84
- BuyerId = buyer . Id ,
85
- SellerId = seller . Id ,
86
- AmountCents = 100 ,
87
- } ;
81
+ var sale = new Sale
82
+ {
83
+ Id = Guid . NewGuid ( ) ,
84
+ TenantId = tenantId ,
85
+ BuyerId = buyer . Id ,
86
+ SellerId = seller . Id ,
87
+ AmountCents = 100 ,
88
+ } ;
89
+
90
+ db . Insert ( sale ) ;
91
+ return sale ;
92
+ }
88
93
89
- db . Insert ( sale ) ;
94
+ [ Test ]
95
+ public void Can_use_cusom_SqlExpression_to_add_multiple_self_Left_Joins ( )
96
+ {
97
+ using ( var db = OpenDbConnection ( ) )
98
+ {
99
+ var tenantId = Guid . NewGuid ( ) ;
100
+ var sale = PopulateData ( db , tenantId ) ;
90
101
91
102
var q = db . From < Sale > ( )
92
103
. CustomJoin ( "LEFT JOIN {0} seller on (Sale.{1} = seller.Id)"
@@ -107,9 +118,10 @@ public void Can_use_cusom_SqlExpression_to_add_multiple_self_Left_Joins()
107
118
108
119
//Alternative
109
120
q = db . From < Sale > ( )
110
- . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . JoinAlias ( "seller" ) )
111
- . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . JoinAlias ( "buyer" ) )
112
- . Select < Sale , ContactIssue > ( ( s , c ) => new {
121
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . JoinAlias ( "seller" ) )
122
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . JoinAlias ( "buyer" ) )
123
+ . Select < Sale , ContactIssue > ( ( s , c ) => new
124
+ {
113
125
s ,
114
126
BuyerFirstName = Sql . JoinAlias ( c . FirstName , "buyer" ) ,
115
127
BuyerLastName = Sql . JoinAlias ( c . LastName , "buyer" ) ,
@@ -124,26 +136,71 @@ public void Can_use_cusom_SqlExpression_to_add_multiple_self_Left_Joins()
124
136
125
137
126
138
var salesView = sales [ 0 ] ;
127
-
139
+
128
140
//salesView.PrintDump();
129
141
130
142
Assert . That ( salesView . Id , Is . EqualTo ( sale . Id ) ) ;
131
143
Assert . That ( salesView . TenantId , Is . EqualTo ( sale . TenantId ) ) ;
132
- Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( buyer . FirstName ) ) ;
133
- Assert . That ( salesView . BuyerLastName , Is . EqualTo ( buyer . LastName ) ) ;
134
- Assert . That ( salesView . SellerFirstName , Is . EqualTo ( seller . FirstName ) ) ;
135
- Assert . That ( salesView . SellerLastName , Is . EqualTo ( seller . LastName ) ) ;
136
144
Assert . That ( salesView . AmountCents , Is . EqualTo ( sale . AmountCents ) ) ;
137
-
145
+ Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
146
+ Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
147
+ Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
148
+ Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
138
149
139
150
q . Select ( "seller.*, 0 EOT, buyer.*" ) ;
140
151
141
152
var multi = db . Select < Tuple < ContactIssue , ContactIssue > > ( q ) ;
142
153
multi . PrintDump ( ) ;
143
154
144
- Assert . That ( multi [ 0 ] . Item1 . FirstName , Is . EqualTo ( "Seller" ) ) ;
145
- Assert . That ( multi [ 0 ] . Item2 . FirstName , Is . EqualTo ( "Buyer" ) ) ;
155
+ Assert . That ( multi [ 0 ] . Item1 . FirstName , Is . EqualTo ( "SellerFirst" ) ) ;
156
+ Assert . That ( multi [ 0 ] . Item2 . FirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
157
+ }
158
+ }
159
+
160
+ [ Test ]
161
+ public void Can_use_CustomSql ( )
162
+ {
163
+ var customFmt = "" ;
164
+ if ( Dialect == Dialect . SqlServer || Dialect == Dialect . SqlServer2012 )
165
+ customFmt = "CONCAT(LEFT({0}, 1),LEFT({1},1))" ;
166
+ else if ( Dialect == Dialect . Sqlite )
167
+ customFmt = "substr({0}, 1, 1) || substr({1}, 1, 1)" ;
168
+
169
+ if ( string . IsNullOrEmpty ( customFmt ) )
170
+ return ;
171
+
172
+ using ( var db = OpenDbConnection ( ) )
173
+ {
174
+ var tenantId = Guid . NewGuid ( ) ;
175
+ var sale = PopulateData ( db , tenantId ) ;
176
+
177
+ var q = db . From < Sale > ( )
178
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . SellerId == c . Id , db . JoinAlias ( "seller" ) )
179
+ . LeftJoin < ContactIssue > ( ( s , c ) => s . BuyerId == c . Id , db . JoinAlias ( "buyer" ) )
180
+ . Select < Sale , ContactIssue > ( ( s , c ) => new
181
+ {
182
+ s ,
183
+ BuyerFirstName = Sql . JoinAlias ( c . FirstName , "buyer" ) ,
184
+ BuyerLastName = Sql . JoinAlias ( c . LastName , "buyer" ) ,
185
+ BuyerInitials = Sql . Custom ( customFmt . Fmt ( "buyer.FirstName" , "buyer.LastName" ) ) ,
186
+ SellerFirstName = Sql . JoinAlias ( c . FirstName , "seller" ) ,
187
+ SellerLastName = Sql . JoinAlias ( c . LastName , "seller" ) ,
188
+ SellerInitials = Sql . Custom ( customFmt . Fmt ( "seller.FirstName" , "seller.LastName" ) ) ,
189
+ } ) ;
190
+
191
+ var sales = db . Select < SaleView > ( q ) ;
192
+ var salesView = sales [ 0 ] ;
193
+
194
+ Assert . That ( salesView . BuyerFirstName , Is . EqualTo ( "BuyerFirst" ) ) ;
195
+ Assert . That ( salesView . BuyerLastName , Is . EqualTo ( "LastBuyer" ) ) ;
196
+ Assert . That ( salesView . BuyerInitials , Is . EqualTo ( "BL" ) ) ;
197
+ Assert . That ( salesView . SellerFirstName , Is . EqualTo ( "SellerFirst" ) ) ;
198
+ Assert . That ( salesView . SellerLastName , Is . EqualTo ( "LastSeller" ) ) ;
199
+ Assert . That ( salesView . SellerInitials , Is . EqualTo ( "SL" ) ) ;
200
+
201
+ sales . PrintDump ( ) ;
146
202
}
147
203
}
204
+
148
205
}
149
206
}
0 commit comments