示例#1
0
        internal AggregateQueryable(IAggregateFluent <TEntity> aggregate, IMongoQueryable <TEntity> queryable)
        {
            aggregate.NotNull(nameof(aggregate));
            queryable.NotNull(nameof(queryable));
            queryable.ElementType.NotNull(nameof(queryable.ElementType));
            queryable.Expression.NotNull(nameof(queryable.Expression));

            aggregateQueryProvider = new AggregateQueryProvider <TEntity>(queryable, this, aggregate);
            ElementType            = queryable.ElementType;
            Expression             = queryable.Expression;
        }
        public static IAggregateQueryable <TEntity> AsAggregateQueryable <TEntity>(this IMongoQueryable <TEntity> queryable)
        {
            queryable.NotNull(nameof(queryable));

            var type            = queryable.Provider.GetType().GetTypeInfo();
            var collectionField = type.GetField("_collection", BindingFlags.Instance | BindingFlags.NonPublic);
            var optionsField    = type.GetField("_options", BindingFlags.Instance | BindingFlags.NonPublic);

            if (!(collectionField?.GetValue(queryable.Provider) is IMongoCollection <TEntity> collection))
            {
                throw new NotSupportedException("This type of IMongoQueryable<> dose not support converting to IAggregateQueryable<>");
            }
            if (!(optionsField?.GetValue(queryable.Provider) is AggregateOptions options))
            {
                throw new NotSupportedException("This type of IMongoQueryable<> dose not support converting to IAggregateQueryable<>");
            }

            var aggregate = collection.Aggregate(options);

            return(new AggregateQueryable <TEntity>(aggregate, queryable));
        }