1
1
using System ;
2
2
using System . Collections ;
3
3
using System . Collections . Generic ;
4
+ using System . Linq ;
4
5
using log4net ;
5
6
using NHibernate . Cache ;
6
7
using NHibernate . Cache . Entry ;
@@ -195,6 +196,127 @@ public void CriteriaQueryFilters()
195
196
testData . Release ( ) ;
196
197
}
197
198
199
+
200
+ [ Test ]
201
+ public void CriteriaControl ( )
202
+ {
203
+ using ( var testData = new TestData ( this ) )
204
+ {
205
+ testData . Prepare ( ) ;
206
+
207
+ // the subquery...
208
+ var subquery = DetachedCriteria
209
+ . For < Salesperson > ( )
210
+ . SetProjection ( Property . ForName ( "Name" ) ) ;
211
+
212
+ using ( var session = OpenSession ( ) )
213
+ using ( var transaction = session . BeginTransaction ( ) )
214
+ {
215
+ session . EnableFilter ( "fulfilledOrders" ) . SetParameter ( "asOfDate" , testData . lastMonth . Date ) ;
216
+ session . EnableFilter ( "regionlist" ) . SetParameter ( "regions" , "APAC" ) ;
217
+
218
+ var result = session
219
+ . CreateCriteria < Order > ( )
220
+ . Add ( Subqueries . In ( "steve" , subquery ) )
221
+ . List ( ) ;
222
+
223
+ Assert . That ( result . Count , Is . EqualTo ( 1 ) ) ;
224
+
225
+ transaction . Commit ( ) ;
226
+ }
227
+ }
228
+ }
229
+
230
+ [ Test ]
231
+ public void CriteriaSubqueryWithFilters ( )
232
+ {
233
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
234
+ // Criteria-subquery test
235
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
236
+ log . Info ( "Starting Criteria-subquery filter tests" ) ;
237
+ using ( var testData = new TestData ( this ) )
238
+ {
239
+ testData . Prepare ( ) ;
240
+
241
+ using ( var session = OpenSession ( ) )
242
+ {
243
+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
244
+
245
+ log . Info ( "Criteria query against Department with a subquery on Salesperson in the APAC reqion..." ) ;
246
+ var salespersonSubquery = DetachedCriteria . For < Salesperson > ( )
247
+ . Add ( Restrictions . Eq ( "Name" , "steve" ) )
248
+ . SetProjection ( Property . ForName ( "Department" ) ) ;
249
+
250
+ var departmentsQuery = session . CreateCriteria < Department > ( ) .
251
+ Add ( Subqueries . PropertyIn ( "Id" , salespersonSubquery ) ) ;
252
+ var departments = departmentsQuery . List < Department > ( ) ;
253
+
254
+ Assert . That ( departments . Count , Is . EqualTo ( 1 ) , "Incorrect department count" ) ;
255
+
256
+ log . Info ( "Criteria query against Department with a subquery on Salesperson in the FooBar reqion..." ) ;
257
+
258
+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "Foobar" ) ;
259
+ departments = departmentsQuery . List < Department > ( ) ;
260
+
261
+ Assert . That ( departments . Count , Is . EqualTo ( 0 ) , "Incorrect department count" ) ;
262
+
263
+ log . Info ( "Criteria query against Order with a subquery for line items with a subquery on product and sold by a given sales person..." ) ;
264
+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
265
+
266
+ var lineItemSubquery = DetachedCriteria . For < LineItem > ( )
267
+ . Add ( Restrictions . Ge ( "Quantity" , 1L ) )
268
+ . CreateCriteria ( "Product" )
269
+ . Add ( Restrictions . Eq ( "Name" , "Acme Hair Gel" ) )
270
+ . SetProjection ( Property . ForName ( "Id" ) ) ;
271
+
272
+ var orders = session . CreateCriteria < Order > ( )
273
+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
274
+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
275
+ . List < Order > ( ) ;
276
+
277
+ Assert . That ( orders . Count , Is . EqualTo ( 1 ) , "Incorrect orders count" ) ;
278
+
279
+ log . Info ( "query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month" ) ;
280
+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
281
+ session . EnableFilter ( "effectiveDate" ) . SetParameter ( "asOfDate" , testData . lastMonth . Date ) ;
282
+
283
+ var productSubquery = DetachedCriteria . For < Product > ( )
284
+ .
285
+ Add ( Restrictions . Eq ( "Name" , "Acme Hair Gel" ) )
286
+ . SetProjection ( Property . ForName ( "id" ) ) ;
287
+
288
+ lineItemSubquery = DetachedCriteria . For < LineItem > ( )
289
+ . Add ( Restrictions . Ge ( "Quantity" , 1L ) )
290
+ . CreateCriteria ( "Product" )
291
+ . Add ( Subqueries . PropertyIn ( "Id" , productSubquery ) )
292
+ . SetProjection ( Property . ForName ( "Id" ) ) ;
293
+
294
+ orders = session
295
+ . CreateCriteria < Order > ( )
296
+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
297
+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
298
+ . List < Order > ( ) ;
299
+
300
+ Assert . That ( orders . Count , Is . EqualTo ( 1 ) , "Incorrect orders count" ) ;
301
+
302
+
303
+ log . Info ( "query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of 4 months ago" ) ;
304
+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
305
+ session . EnableFilter ( "effectiveDate" ) . SetParameter ( "asOfDate" , testData . fourMonthsAgo . Date ) ;
306
+
307
+ orders = session . CreateCriteria < Order > ( )
308
+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
309
+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
310
+ . List < Order > ( ) ;
311
+
312
+ Assert . That ( orders . Count , Is . EqualTo ( 0 ) , "Incorrect orders count" ) ;
313
+
314
+ session . Close ( ) ;
315
+ }
316
+ }
317
+ }
318
+
319
+
198
320
[ Test ]
199
321
public void GetFilters ( )
200
322
{
@@ -472,10 +594,7 @@ public void ManyToManyBaseThruCriteria()
472
594
testData . Release ( ) ;
473
595
}
474
596
475
- protected override string MappingsAssembly
476
- {
477
- get { return "NHibernate.Test" ; }
478
- }
597
+ protected override string MappingsAssembly => "NHibernate.Test" ;
479
598
480
599
protected override IList Mappings
481
600
{
@@ -489,7 +608,7 @@ protected override IList Mappings
489
608
}
490
609
}
491
610
492
- private class TestData
611
+ private class TestData : IDisposable
493
612
{
494
613
public long steveId ;
495
614
public long deptId ;
@@ -621,6 +740,11 @@ public void Release()
621
740
transaction . Commit ( ) ;
622
741
session . Close ( ) ;
623
742
}
743
+
744
+ public void Dispose ( )
745
+ {
746
+ Release ( ) ;
747
+ }
624
748
}
625
749
}
626
750
}
0 commit comments