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