private static void ApplyPredicate <TEntity, TForeign>(AggregateQueryable <TEntity> aggregateQueryable, Expression predicate, string asFieldName) { if (predicate == null) { return; } var foreignType = typeof(TForeign); var isEnumerable = typeof(TForeign).IsEnumerable(); if (isEnumerable) { foreignType = foreignType.GetElementTypeOf(); } //lamb = Expression.Lambda(methodCall.Arguments[0], Expression.Parameter(typeof(TEntity), "p")); var filterDefinitionBuilder = new FilterDefinitionBuilder <TEntity>(); var param1Type = typeof(FieldDefinition <TEntity>); var param2Type = typeof(FilterDefinition <>).MakeGenericType(foreignType); var method = filterDefinitionBuilder.GetType() .GetGenericMethod(nameof(filterDefinitionBuilder.ElemMatch), BindingFlags.Public | BindingFlags.Instance, new[] { foreignType }, new[] { param1Type, param2Type }, typeof(FilterDefinition <TEntity>)); var expressionFilterDefinition = Activator.CreateInstance(typeof(ExpressionFilterDefinition <>).MakeGenericType(foreignType), predicate); var asField = new StringFieldDefinition <TEntity>(asFieldName); var elmMatch = (FilterDefinition <TEntity>)method.Invoke(filterDefinitionBuilder, new object[] { asField, expressionFilterDefinition }); //Filter ($match) elements of TForeign using predicate aggregateQueryable.AggregateFluent = aggregateQueryable.AggregateFluent.Match(elmMatch); }