From 0346a448c49bd93d3fe8978ad91a8ab8bb0c0e36 Mon Sep 17 00:00:00 2001 From: honzapatCZ Date: Tue, 24 Sep 2024 16:59:15 +0200 Subject: [PATCH] try fixup search --- Utils/Extensions.cs | 48 ++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/Utils/Extensions.cs b/Utils/Extensions.cs index bce8985..47747c2 100644 --- a/Utils/Extensions.cs +++ b/Utils/Extensions.cs @@ -55,34 +55,38 @@ public static class Extensions } var extPar = Expression.Parameter(typeof(TType)); - var binder = (TEntityBinder)typeof(TEntityBinder).GetConstructor(new[] { typeof(DbContext) })!.Invoke(new object?[] { null }); - var idMatcher = binder.RouteValues.First(x => x.Primary).Expression; - var reducedIdMatcher = Expression.Lambda>(Expression.Invoke(idMatcher, extPar, Expression.Constant(search)).Reduce(), extPar); - //Console.Writeline(reducedIdMatcher); - searchers.Add(reducedIdMatcher); - // Create an expression that ORs all the searchers - var agrPar = Expression.Parameter(typeof(TType)); - - var orExp = searchers.Aggregate((Expression)null, (current, searcher) => + using (var scope = providers.CreateScope()) { - var body = Expression.Invoke(searcher, agrPar); - if (current == null) + var binder = scope.ServiceProvider.GetRequiredService(); + var idMatcher = binder.RouteValues.First(x => x.Primary).Expression; + var reducedIdMatcher = Expression.Lambda>(Expression.Invoke(idMatcher, extPar, Expression.Constant(search)).Reduce(), extPar); + //Console.Writeline(reducedIdMatcher); + searchers.Add(reducedIdMatcher); + + // Create an expression that ORs all the searchers + var agrPar = Expression.Parameter(typeof(TType)); + + var orExp = searchers.Aggregate((Expression)null, (current, searcher) => { - return body; + var body = Expression.Invoke(searcher, agrPar); + if (current == null) + { + return body; + } + return Expression.OrElse(current, body); + }); + + //reduce the epxression as much as possible + while (orExp.CanReduce) + { + orExp = orExp.Reduce(); } - return Expression.OrElse(current, body); - }); - //reduce the epxression as much as possible - while (orExp.CanReduce) - { - orExp = orExp.Reduce(); + var orLambda = Expression.Lambda>(orExp, agrPar); + //Console.Writeline(orLambda); + query = query.Where(orLambda); } - - var orLambda = Expression.Lambda>(orExp, agrPar); - //Console.Writeline(orLambda); - query = query.Where(orLambda); } return await query.ApplyPaginationRes(providers, pag);