@@ -82,36 +82,6 @@ module ObjectListFilterExtensions =
8282 // | t when Type.(=)(t, typeof<Building>) -> ResidentialPropertiesConstants.Discriminators.Building
8383 // )
8484
85- type DiscriminatorExpression < 'T , 'D > =
86- | GetDiscriminatorValue of ( 'T -> 'D )
87- | CompareDiscriminator of Expression < Func < 'T , 'D , bool >>
88-
89- [<Struct>]
90- type ObjectListFilterLinqOptions < 'T , 'D > (
91- discriminatorExpression : DiscriminatorExpression< 'T, 'D> | null ,
92- [<Optional>] getDiscriminatorValue: ( Type -> 'D) | null ,
93- [<Optional>] serializeMemberName: ( MemberInfo -> string) | null ) =
94-
95- member _.DiscriminatorExpression = discriminatorExpression |> ValueOption.ofObj
96- member _.GetDiscriminatorValue = getDiscriminatorValue |> ValueOption.ofObj
97- member _.SerializeMemberName = serializeMemberName |> ValueOption.ofObj
98-
99- static member None = ObjectListFilterLinqOptions< 'T, 'D> ( null , null , null )
100-
101- new ( getDiscriminatorValue : 'T -> 'D ) = ObjectListFilterLinqOptions< 'T, 'D> ( GetDiscriminatorValue getDiscriminatorValue, null , null )
102- new ( compareDiscriminator : Expression < Func < 'T , 'D , bool >>) = ObjectListFilterLinqOptions< 'T, 'D> ( CompareDiscriminator compareDiscriminator, null , null )
103- new ( getDiscriminatorValue : Type -> 'D ) = ObjectListFilterLinqOptions< 'T, 'D> ( null , getDiscriminatorValue, null )
104- new ( serializeMemberName : MemberInfo -> string ) = ObjectListFilterLinqOptions< 'T, 'D> ( null , null , serializeMemberName)
105-
106- new ( getDiscriminatorValue : 'T -> 'D , serializeMemberName : MemberInfo -> string ) = ObjectListFilterLinqOptions< 'T, 'D> ( GetDiscriminatorValue getDiscriminatorValue, null , serializeMemberName)
107- new ( compareDiscriminator : Expression < Func < 'T , 'D , bool >>, serializeMemberName : MemberInfo -> string ) = ObjectListFilterLinqOptions< 'T, 'D> ( CompareDiscriminator compareDiscriminator, null , serializeMemberName)
108- new ( getDiscriminatorValue : Type -> 'D , serializeMemberName : MemberInfo -> string ) = ObjectListFilterLinqOptions< 'T, 'D> ( null , getDiscriminatorValue, serializeMemberName)
109-
110- // Helper to create lambda from body expression
111- let makeLambda < 'T > ( param : ParameterExpression ) ( body : Expression ) =
112- let delegateType = typedefof< Func<_, _>>. MakeGenericType ([| typeof< 'T>; body.Type |])
113- Expression.Lambda ( delegateType, body, param)
114-
11585 let private genericWhereMethod =
11686 typeof< Queryable>. GetMethods ()
11787 |> Seq.where ( fun m -> m.Name = " Where" )
@@ -123,7 +93,7 @@ module ObjectListFilterExtensions =
12393 // Helper to create Where expression
12494 let whereExpr < 'T > ( query : IQueryable < 'T >) ( param : ParameterExpression ) predicate =
12595 let whereMethod = genericWhereMethod.MakeGenericMethod ([| typeof< 'T> |])
126- Expression.Call ( whereMethod, [| query.Expression; makeLambda < 'T > param predicate |])
96+ Expression.Call ( whereMethod, [| query.Expression; Expression.Lambda < Func < 'T , bool >> ( predicate, param ) |])
12797
12898 let private StringStartsWithMethod = typeof< string>. GetMethod ( " StartsWith" , [| typeof< string> |])
12999 let private StringEndsWithMethod = typeof< string>. GetMethod ( " EndsWith" , [| typeof< string> |])
@@ -164,67 +134,61 @@ module ObjectListFilterExtensions =
164134 let paramExpr = Expression.PropertyOrField ( param, f.FieldName)
165135 buildFilterExpr ( SourceExpression paramExpr) buildTypeDiscriminatorCheck f.Value
166136
167- type ObjectListFilter with
137+ [<Struct>]
138+ type ObjectListFilterLinqOptions < 'T , 'D > (
139+ [<Optional>] compareDiscriminator : Expression< Func< 'T, 'D, bool>> | null ,
140+ [<Optional>] getDiscriminatorValue : ( Type -> 'D) | null ,
141+ [<Optional>] serializeMemberName : ( MemberInfo -> string) | null ) =
168142
169- member filter.Apply < 'T , 'D >
170- ( query : IQueryable < 'T >, compareDiscriminator : Expression < Func < 'T , 'D , bool >>, getDiscriminatorValue : ( Type -> 'D ))
171- =
143+ member _.CompareDiscriminator = compareDiscriminator |> ValueOption.ofObj
144+ member _.GetDiscriminatorValue = getDiscriminatorValue |> ValueOption.ofObj
145+ //member _.SerializeMemberName = serializeMemberName |> ValueOption.ofObj
172146
173- match filter with
174- | NoFilter -> query
175- | _ ->
147+ static member None = ObjectListFilterLinqOptions< 'T, 'D> ( null , null , null )
176148
177- // Helper for discriminator comparison
178- let buildTypeDiscriminatorCheck ( param : SourceExpression ) ( t : Type ) =
179- match compareDiscriminator, getDiscriminatorValue with
180- | null , discValueFn when obj.Equals ( discValueFn, null ) ->
181- // use __typename from filter and do type.ToSting() for values
182- Unchecked.defaultof< Expression>
183- | discExpr, discValueFn when obj.Equals ( discValueFn, null ) ->
184- // use discriminator and do type.ToSting() for values
185- Unchecked.defaultof< Expression>
186- | null , discValueFn ->
187- // use __typename from filter and execute discValueFn for values
188- Unchecked.defaultof< Expression>
189- | discExpr, discValueFn ->
190- // use discriminator and execute discValueFn for values
149+ static member GetCompareDiscriminator ( getDiscriminatorValue : Expression < Func < 'T , 'D >>) =
150+ let tParam = Expression.Parameter ( typeof< 'T>, " x" )
151+ let dParam = Expression.Parameter ( typeof< 'D>, " d" )
152+ let body = Expression.Equal( Expression.Invoke( getDiscriminatorValue, tParam), dParam)
153+ Expression.Lambda< Func< 'T, 'D, bool>> ( body, tParam, dParam)
191154
192- let discriminatorValue = discValueFn t
193- Expression.Equal ( Expression.PropertyOrField ( param, " __discriminator" ), Expression.Constant ( discriminatorValue))
155+ new ( getDiscriminator : Expression < Func < 'T , 'D >>) = ObjectListFilterLinqOptions< 'T, 'D> ( ObjectListFilterLinqOptions.GetCompareDiscriminator getDiscriminator, null , null )
156+ new ( compareDiscriminator : Expression < Func < 'T , 'D , bool >>) = ObjectListFilterLinqOptions< 'T, 'D> ( compareDiscriminator, null , null )
157+ new ( getDiscriminatorValue : Type -> 'D ) = ObjectListFilterLinqOptions< 'T, 'D> ( null , getDiscriminatorValue, null )
158+ //new (serializeMemberName : MemberInfo -> string) = ObjectListFilterLinqOptions<'T, 'D> (null, null, serializeMemberName)
194159
195- let queryExpr =
196- let param = Expression.Parameter ( typeof< 'T>, " x" )
197- let body = buildFilterExpr ( SourceExpression param) buildTypeDiscriminatorCheck filter
198- whereExpr< 'T> query param body
199- // Create and execute the final expression
200- query.Provider.CreateQuery< 'T> ( queryExpr)
160+ new ( getDiscriminator : Expression < Func < 'T , 'D >>, getDiscriminatorValue : Type -> 'D ) = ObjectListFilterLinqOptions< 'T, 'D> ( ObjectListFilterLinqOptions.GetCompareDiscriminator getDiscriminator, getDiscriminatorValue, null )
161+
162+ //new (getDiscriminator : Expression<Func<'T, 'D>>, serializeMemberName : MemberInfo -> string) = ObjectListFilterLinqOptions<'T, 'D> (ObjectListFilterLinqOptions.GetCompareDiscriminator getDiscriminator, null, serializeMemberName)
163+ //new (compareDiscriminator : Expression<Func<'T, 'D, bool>>, serializeMemberName : MemberInfo -> string) = ObjectListFilterLinqOptions<'T, 'D> (compareDiscriminator, null, serializeMemberName)
164+ //new (getDiscriminatorValue : Type -> 'D, serializeMemberName : MemberInfo -> string) = ObjectListFilterLinqOptions<'T, 'D> (null, getDiscriminatorValue, serializeMemberName)
165+
166+ type ObjectListFilter with
201167
202- member filter.Apply < 'T , 'D >
203- ( query : IQueryable < 'T >, [<Optional>] getDiscriminator : Expression < Func < 'T , 'D >> | null , [<Optional>] getDiscriminatorValue : Type -> 'D )
204- =
168+ member filter.Apply < 'T , 'D > ( query : IQueryable < 'T >, [<Optional>] options : ObjectListFilterLinqOptions < 'T , 'D >) =
205169
206170 match filter with
207171 | NoFilter -> query
208172 | _ ->
209173 // Helper for discriminator comparison
210174 let buildTypeDiscriminatorCheck ( param : SourceExpression ) ( t : Type ) =
211- match getDiscriminator , getDiscriminatorValue with
212- | null , discValueFn when obj.Equals ( discValueFn , null ) ->
175+ match options.CompareDiscriminator , options.GetDiscriminatorValue with
176+ | ValueNone , ValueNone ->
213177 // use __typename from filter and do type.ToSting() for values
214178 let typename = t.FullName
215179 Expression.Equal( Expression.PropertyOrField( param, " __typename" ), Expression.Constant( typename)) :> Expression
216- | discExpr, discValueFn when obj.Equals ( discValueFn , null ) ->
180+ | ValueSome discExpr, ValueNone ->
217181 // use discriminator and do type.ToSting() for values
218182 let typename = t.FullName
219- Expression.Equal ( Expression. Invoke( discExpr, param) , Expression.Constant( typename)) :> Expression
220- | null , discValueFn ->
183+ Expression.Invoke( discExpr, param, Expression.Constant( typename)) :> Expression
184+ | ValueNone , ValueSome discValueFn ->
221185 // use __typename from filter and execute discValueFn for values
222186 let discriminatorValue = discValueFn t
223187 Expression.Equal( Expression.PropertyOrField( param, " __typename" ), Expression.Constant( discriminatorValue)) :> Expression
224- | discExpr, discValueFn ->
188+ | ValueSome discExpr, ValueSome discValueFn ->
225189 // use discriminator and execute discValueFn for values
226190 let discriminatorValue = discValueFn t
227- Expression.Equal ( Expression. Invoke( discExpr, param) , Expression.Constant ( discriminatorValue))
191+ Expression.Invoke( discExpr, param, Expression.Constant ( discriminatorValue))
228192
229193 let queryExpr =
230194 let param = Expression.Parameter ( typeof< 'T>, " x" )
0 commit comments