public Expression Optimize(Expression e, string?discriminator) { if (discriminator is not null) { if (e.Type.IsGenericType) { Type? sourceType = e.Type.GetGenericArguments()[0]; MethodInfo wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(sourceType); e = (Expression)wrapInWhere.Invoke(null, new object[] { e, discriminator }); } else { Type sourceType = e.Type; MethodInfo wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(sourceType); var rootMethodCallExpression = e as MethodCallExpression; Expression source = rootMethodCallExpression !.Arguments[0]; var discriminatorWrap = (MethodCallExpression)wrapInWhere.Invoke(null, new object[] { source, discriminator }); if (rootMethodCallExpression.Arguments.Count == 1) { e = Expression.Call(rootMethodCallExpression.Method, discriminatorWrap); } else { e = Expression.Call(rootMethodCallExpression.Method, discriminatorWrap, rootMethodCallExpression.Arguments[1]); } } } e = LocalExpressions.PartialEval(e); return(Visit(e)); }
public Expression Optimize(Expression e, string?discriminator) { if (discriminator is not null) { Type? sourceType = e.Type.GetGenericArguments()[0]; MethodInfo?wrapInWhere = WrapInWhereGenericMethod.MakeGenericMethod(new[] { sourceType }); e = (Expression)wrapInWhere.Invoke(null, new object[] { e, discriminator }); } e = LocalExpressions.PartialEval(e); return(Visit(e)); }
public Expression Optimize(Expression e) { e = LocalExpressions.PartialEval(e); return(Visit(e)); }