@@ -5,6 +5,7 @@ namespace Microsoft.SCIM.WebHostSample.Provider
55 using System ;
66 using System . Collections . Generic ;
77 using System . Linq ;
8+ using System . Linq . Expressions ;
89 using System . Net ;
910 using System . Threading . Tasks ;
1011 using System . Web . Http ;
@@ -94,7 +95,10 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
9495 throw new ArgumentException ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionInvalidParameters ) ;
9596 }
9697
97- IEnumerable < Resource > results = new List < Core2EnterpriseUser > ( ) ;
98+ IEnumerable < Resource > results ;
99+ var predicate = PredicateBuilder . False < Core2EnterpriseUser > ( ) ;
100+ Expression < Func < Core2EnterpriseUser , bool > > predicateAnd ;
101+
98102
99103 if ( parameters . AlternateFilters . Count <= 0 )
100104 {
@@ -103,11 +107,10 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
103107 }
104108 else
105109 {
106- results = new List < Core2EnterpriseUser > ( ) ;
107110
108111 foreach ( IFilter queryFilter in parameters . AlternateFilters )
109112 {
110- IEnumerable < Core2EnterpriseUser > users = this . storage . Users . Values ;
113+ predicateAnd = PredicateBuilder . True < Core2EnterpriseUser > ( ) ;
111114
112115 IFilter andFilter = queryFilter ;
113116 IFilter currentFilter = andFilter ;
@@ -132,13 +135,10 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
132135 string . Format ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionFilterOperatorNotSupportedTemplate , andFilter . FilterOperator ) ) ;
133136 }
134137
135- users =
136- users . Where (
137- item =>
138- string . Equals (
139- item . UserName ,
140- andFilter . ComparisonValue ,
141- StringComparison . OrdinalIgnoreCase ) ) ;
138+ string userName = andFilter . ComparisonValue ;
139+ predicateAnd = predicateAnd . And ( p => string . Equals ( p . UserName , userName , StringComparison . OrdinalIgnoreCase ) ) ;
140+
141+
142142 }
143143
144144 // ExternalId filter
@@ -150,34 +150,13 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
150150 string . Format ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionFilterOperatorNotSupportedTemplate , andFilter . FilterOperator ) ) ;
151151 }
152152
153- users =
154- users . Where (
155- item =>
156- string . Equals (
157- item . ExternalIdentifier ,
158- andFilter . ComparisonValue ,
159- StringComparison . OrdinalIgnoreCase ) ) . ToList ( ) ;
160- }
161-
162- // Id filter
163- else if ( andFilter . AttributePath . Equals ( AttributeNames . Identifier , StringComparison . OrdinalIgnoreCase ) )
164- {
165- if ( andFilter . FilterOperator != ComparisonOperator . Equals )
166- {
167- throw new NotSupportedException (
168- string . Format ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionFilterOperatorNotSupportedTemplate , andFilter . FilterOperator ) ) ;
169- }
153+ string externalIdentifier = andFilter . ComparisonValue ;
154+ predicateAnd = predicateAnd . And ( p => string . Equals ( p . ExternalIdentifier , externalIdentifier , StringComparison . OrdinalIgnoreCase ) ) ;
170155
171- users =
172- users . Where (
173- item =>
174- string . Equals (
175- item . Identifier ,
176- andFilter . ComparisonValue ,
177- StringComparison . OrdinalIgnoreCase ) ) . ToList ( ) ;
156+
178157 }
179158
180- // Active filter
159+ //Active Filter
181160 else if ( andFilter . AttributePath . Equals ( AttributeNames . Active , StringComparison . OrdinalIgnoreCase ) )
182161 {
183162 if ( andFilter . FilterOperator != ComparisonOperator . Equals )
@@ -186,32 +165,34 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
186165 string . Format ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionFilterOperatorNotSupportedTemplate , andFilter . FilterOperator ) ) ;
187166 }
188167
189- users =
190- users . Where (
191- item =>
192- item . Active == bool . Parse ( andFilter . ComparisonValue ) ) . ToList ( ) ;
168+ bool active = bool . Parse ( andFilter . ComparisonValue ) ;
169+ predicateAnd = predicateAnd . And ( p => p . Active == active ) ;
170+
193171 }
194172
195- // LastModified filter
173+ //LastModified filter
196174 else if ( andFilter . AttributePath . Equals ( $ "{ AttributeNames . Metadata } .{ AttributeNames . LastModified } ", StringComparison . OrdinalIgnoreCase ) )
197175 {
198176 if ( andFilter . FilterOperator == ComparisonOperator . EqualOrGreaterThan )
199177 {
200- users =
201- users . Where (
202- item =>
203- item . Metadata . LastModified >= DateTime . Parse ( andFilter . ComparisonValue ) . ToUniversalTime ( ) ) . ToList ( ) ;
178+ DateTime comparisonValue = DateTime . Parse ( andFilter . ComparisonValue ) . ToUniversalTime ( ) ;
179+ predicateAnd = predicateAnd . And ( p => p . Metadata . LastModified >= comparisonValue ) ;
180+
181+
204182 }
205183 else if ( andFilter . FilterOperator == ComparisonOperator . EqualOrLessThan )
206184 {
207- users =
208- users . Where (
209- item =>
210- item . Metadata . LastModified <= DateTime . Parse ( andFilter . ComparisonValue ) . ToUniversalTime ( ) ) . ToList ( ) ;
185+ DateTime comparisonValue = DateTime . Parse ( andFilter . ComparisonValue ) . ToUniversalTime ( ) ;
186+ predicateAnd = predicateAnd . And ( p => p . Metadata . LastModified <= comparisonValue ) ;
187+
188+
211189 }
212190 else
213191 throw new NotSupportedException (
214192 string . Format ( SystemForCrossDomainIdentityManagementServiceResources . ExceptionFilterOperatorNotSupportedTemplate , andFilter . FilterOperator ) ) ;
193+
194+
195+
215196 }
216197 else
217198 throw new NotSupportedException (
@@ -222,8 +203,11 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
222203
223204 } while ( currentFilter . AdditionalFilter != null ) ;
224205
225- results = results . Union ( users . Select ( ( Core2EnterpriseUser user ) => user as Resource ) . ToList ( ) ) ;
206+ predicate = predicate . Or ( predicateAnd ) ;
207+
226208 }
209+
210+ results = this . storage . Users . Values . Where ( predicate . Compile ( ) ) ;
227211 }
228212
229213 if ( parameters . PaginationParameters != null )
0 commit comments