Пример #1
0
        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);
        }