try fixup search
This commit is contained in:
parent
f61f9e7cb1
commit
0346a448c4
|
|
@ -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<Func<TType, bool>>(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<TEntityBinder>();
|
||||
var idMatcher = binder.RouteValues.First(x => x.Primary).Expression;
|
||||
var reducedIdMatcher = Expression.Lambda<Func<TType, bool>>(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<Func<TType, bool>>(orExp, agrPar);
|
||||
//Console.Writeline(orLambda);
|
||||
query = query.Where(orLambda);
|
||||
}
|
||||
|
||||
var orLambda = Expression.Lambda<Func<TType, bool>>(orExp, agrPar);
|
||||
//Console.Writeline(orLambda);
|
||||
query = query.Where(orLambda);
|
||||
}
|
||||
|
||||
return await query.ApplyPaginationRes<TType, TResponseType>(providers, pag);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user