1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq . Expressions ;
4
+ using System . Data ;
5
+ using System . Linq ;
6
+ using NUnit . Framework ;
7
+ using ServiceStack . DataAnnotations ;
8
+
9
+ namespace ServiceStack . OrmLite . Tests
10
+ {
11
+ public class EntityBase
12
+ {
13
+ public int TenantId { get ; set ; }
14
+ public bool Deleted { get ; set ; }
15
+ }
16
+
17
+ public class CustomerEntity : EntityBase
18
+ {
19
+ [ AutoIncrement ]
20
+ public int Id { get ; set ; }
21
+
22
+ public string CustomerName { get ; set ; }
23
+ }
24
+
25
+ public class EmployeeEntity : EntityBase
26
+ {
27
+ [ AutoIncrement ]
28
+ public int Id { get ; set ; }
29
+
30
+ public string EmployeeType { get ; set ; }
31
+ }
32
+
33
+ class TenantRepo
34
+ {
35
+ public int tenantId ;
36
+ public TenantRepo ( int tenantId ) => this . tenantId = tenantId ;
37
+
38
+ public List < T > All < T > ( IDbConnection db )
39
+ {
40
+ return db . Where < T > ( new { TenantId = tenantId } ) ;
41
+ }
42
+
43
+ public List < T > AllUntyped < T > ( IDbConnection db )
44
+ {
45
+ return db . Where < T > ( nameof ( EntityBase . TenantId ) , tenantId ) ;
46
+ }
47
+
48
+ private SqlExpression < T > CreateQuery < T > ( IDbConnection db )
49
+ {
50
+ return db . From < T > ( ) . Where ( x => ( x as EntityBase ) . TenantId == tenantId ) ;
51
+ }
52
+
53
+ public List < T > AllTyped < T > ( IDbConnection db )
54
+ {
55
+ return db . Select ( CreateQuery < T > ( db ) ) ;
56
+ }
57
+
58
+ public List < T > Where < T > ( IDbConnection db , Expression < Func < T , bool > > expr )
59
+ {
60
+ return db . Select ( CreateQuery < T > ( db ) . And ( expr ) ) ;
61
+ }
62
+ }
63
+
64
+ abstract class EntityRepoBase < T > where T : EntityBase , new ( )
65
+ {
66
+ public int tenantId ;
67
+ public EntityRepoBase ( int tenantId ) => this . tenantId = tenantId ;
68
+
69
+ public List < T > All ( IDbConnection db ) =>
70
+ db . Select ( db . From < T > ( ) . Where ( x => x . TenantId == tenantId ) ) ;
71
+
72
+ public List < T > Where ( IDbConnection db , Expression < Func < T , bool > > expr ) =>
73
+ db . Select ( db . From < T > ( ) . Where ( x => x . TenantId == tenantId ) . And ( expr ) ) ;
74
+ }
75
+
76
+ class CustomerTenantRepo : EntityRepoBase < CustomerEntity >
77
+ {
78
+ public CustomerTenantRepo ( int tenantId ) : base ( tenantId ) { }
79
+ }
80
+
81
+ [ TestFixture ]
82
+ public class EntityBaseTests : OrmLiteTestBase
83
+ {
84
+ public void SeedData ( IDbConnection db )
85
+ {
86
+ OrmLiteUtils . PrintSql ( ) ;
87
+ db . DropAndCreateTable < CustomerEntity > ( ) ;
88
+ db . Insert ( new CustomerEntity { TenantId = 1 , CustomerName = "Kurt" } ) ;
89
+ db . Insert ( new CustomerEntity { TenantId = 1 , CustomerName = "Dave" } ) ;
90
+ db . Insert ( new CustomerEntity { TenantId = 2 , CustomerName = "Kurt" } ) ;
91
+ db . Insert ( new CustomerEntity { TenantId = 2 , CustomerName = "Dave" } ) ;
92
+ }
93
+
94
+ [ Test ]
95
+ public void Can_generically_query_base_class ( )
96
+ {
97
+ var repo = new TenantRepo ( 2 ) ;
98
+
99
+ using ( var db = OpenDbConnection ( ) )
100
+ {
101
+ SeedData ( db ) ;
102
+
103
+ var rows = repo . All < CustomerEntity > ( db ) ;
104
+ Assert . That ( rows . Count , Is . EqualTo ( 2 ) ) ;
105
+ Assert . That ( rows . All ( x => x . TenantId == 2 ) ) ;
106
+
107
+ rows = repo . AllTyped < CustomerEntity > ( db ) ;
108
+ Assert . That ( rows . Count , Is . EqualTo ( 2 ) ) ;
109
+ Assert . That ( rows . All ( x => x . TenantId == 2 ) ) ;
110
+
111
+ rows = repo . AllUntyped < CustomerEntity > ( db ) ;
112
+ Assert . That ( rows . Count , Is . EqualTo ( 2 ) ) ;
113
+ Assert . That ( rows . All ( x => x . TenantId == 2 ) ) ;
114
+
115
+ rows = repo . Where < CustomerEntity > ( db , x => x . CustomerName == "Kurt" ) ;
116
+ Assert . That ( rows . Count , Is . EqualTo ( 1 ) ) ;
117
+ Assert . That ( rows [ 0 ] . TenantId , Is . EqualTo ( 2 ) ) ;
118
+ }
119
+ }
120
+
121
+ [ Test ]
122
+ public void Can_generically_query_base_class_with_constrained_repo ( )
123
+ {
124
+ var repo = new CustomerTenantRepo ( 2 ) ;
125
+
126
+ using ( var db = OpenDbConnection ( ) )
127
+ {
128
+ SeedData ( db ) ;
129
+
130
+ var rows = repo . All ( db ) ;
131
+ Assert . That ( rows . Count , Is . EqualTo ( 2 ) ) ;
132
+ Assert . That ( rows . All ( x => x . TenantId == 2 ) ) ;
133
+
134
+ rows = repo . Where ( db , x => x . CustomerName == "Kurt" ) ;
135
+ Assert . That ( rows . Count , Is . EqualTo ( 1 ) ) ;
136
+ Assert . That ( rows [ 0 ] . TenantId , Is . EqualTo ( 2 ) ) ;
137
+ }
138
+ }
139
+ }
140
+ }
0 commit comments