1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Data ;
3
4
using NUnit . Framework ;
4
5
using ServiceStack . DataAnnotations ;
@@ -14,6 +15,12 @@ public class LetterFrequency
14
15
public string Letter { get ; set ; }
15
16
}
16
17
18
+ public class LetterWeighting
19
+ {
20
+ public long LetterFrequencyId { get ; set ; }
21
+ public int Weighting { get ; set ; }
22
+ }
23
+
17
24
public class SqlExpressionTests : ExpressionsTestBase
18
25
{
19
26
private static void InitLetters ( IDbConnection db )
@@ -70,5 +77,85 @@ public void Can_select_ColumnDistinct_with_SqlExpression()
70
77
Assert . That ( uniqueLetters . EquivalentTo ( new [ ] { "A" , "B" , "C" } ) ) ;
71
78
}
72
79
}
80
+
81
+ [ Test ]
82
+ public void Can_select_limit_with_SqlExpression ( )
83
+ {
84
+ using ( var db = OpenDbConnection ( ) )
85
+ {
86
+ db . DropAndCreateTable < LetterFrequency > ( ) ;
87
+ db . DropAndCreateTable < LetterWeighting > ( ) ;
88
+
89
+ var letters = "A,B,C,D,E" . Split ( ',' ) ;
90
+ var i = 0 ;
91
+ letters . Each ( letter =>
92
+ {
93
+ var id = db . Insert ( new LetterFrequency { Letter = letter } , selectIdentity : true ) ;
94
+ db . Insert ( new LetterWeighting { LetterFrequencyId = id , Weighting = ++ i * 10 } ) ;
95
+ } ) ;
96
+
97
+ var results = db . Select ( db . From < LetterFrequency > ( ) . Limit ( 3 ) ) ;
98
+ Assert . That ( results . Count , Is . EqualTo ( 3 ) ) ;
99
+
100
+ results = db . Select ( db . From < LetterFrequency > ( ) . Skip ( 3 ) ) ;
101
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
102
+
103
+ results = db . Select ( db . From < LetterFrequency > ( ) . Limit ( 1 , 2 ) ) ;
104
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
105
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "B" , "C" } ) ) ;
106
+
107
+ results = db . Select ( db . From < LetterFrequency > ( ) . Skip ( 1 ) . Take ( 2 ) ) ;
108
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "B" , "C" } ) ) ;
109
+
110
+ results = db . Select ( db . From < LetterFrequency > ( )
111
+ . OrderByDescending ( x => x . Letter )
112
+ . Skip ( 1 ) . Take ( 2 ) ) ;
113
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "D" , "C" } ) ) ;
114
+ }
115
+ }
116
+
117
+ [ Test ]
118
+ public void Can_select_limit_with_JoinSqlBuilder ( )
119
+ {
120
+ using ( var db = OpenDbConnection ( ) )
121
+ {
122
+ db . DropAndCreateTable < LetterFrequency > ( ) ;
123
+ db . DropAndCreateTable < LetterWeighting > ( ) ;
124
+
125
+ var letters = "A,B,C,D,E" . Split ( ',' ) ;
126
+ var i = 0 ;
127
+ letters . Each ( letter =>
128
+ {
129
+ var id = db . Insert ( new LetterFrequency { Letter = letter } , selectIdentity : true ) ;
130
+ db . Insert ( new LetterWeighting { LetterFrequencyId = id , Weighting = ++ i * 10 } ) ;
131
+ } ) ;
132
+
133
+ var joinFn = new Func < JoinSqlBuilder < LetterFrequency , LetterWeighting > > ( ( ) =>
134
+ new JoinSqlBuilder < LetterFrequency , LetterWeighting > ( )
135
+ . Join < LetterFrequency , LetterWeighting > ( x => x . Id , x => x . LetterFrequencyId )
136
+ ) ;
137
+
138
+ var results = db . Select < LetterFrequency > ( joinFn ( ) ) ;
139
+ Assert . That ( results . Count , Is . EqualTo ( 5 ) ) ;
140
+
141
+ results = db . Select < LetterFrequency > ( joinFn ( ) . Limit ( 3 ) ) ;
142
+ Assert . That ( results . Count , Is . EqualTo ( 3 ) ) ;
143
+
144
+ results = db . Select < LetterFrequency > ( joinFn ( ) . Skip ( 3 ) ) ;
145
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
146
+
147
+ results = db . Select < LetterFrequency > ( joinFn ( ) . Limit ( 1 , 2 ) ) ;
148
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
149
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "B" , "C" } ) ) ;
150
+
151
+ results = db . Select < LetterFrequency > ( joinFn ( ) . Skip ( 1 ) . Take ( 2 ) ) ;
152
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "B" , "C" } ) ) ;
153
+
154
+ results = db . Select < LetterFrequency > ( joinFn ( )
155
+ . OrderByDescending < LetterFrequency > ( x => x . Letter )
156
+ . Skip ( 1 ) . Take ( 2 ) ) ;
157
+ Assert . That ( results . ConvertAll ( x => x . Letter ) , Is . EquivalentTo ( new [ ] { "D" , "C" } ) ) ;
158
+ }
159
+ }
73
160
}
74
161
}
0 commit comments